Sql server 用第三个不相关的表连接两个表

Sql server 用第三个不相关的表连接两个表,sql-server,Sql Server,我有两个相关的product表和第三个无关的period表,我想用它们来确保返回的数据是完整的 我不想存储每个产品的所有空时段,只想存储获得销售的时段 首先,我们有财务表,它是所有时期的“主数据”: ID | PERIOD ------------ 1 | Jan 2 | Feb 3 | Mar 然后是产品和销售表 ID | Code ------------ 1 | ABC 2 | XYZ Product_ID | Period_ID | Sales --------------

我有两个相关的product表和第三个无关的period表,我想用它们来确保返回的数据是完整的

我不想存储每个产品的所有空时段,只想存储获得销售的时段

首先,我们有财务表,它是所有时期的“主数据”:

ID | PERIOD
------------
1  | Jan
2  | Feb
3  | Mar
然后是产品和销售表

ID | Code
------------
1  | ABC
2  | XYZ

Product_ID | Period_ID | Sales
------------------------------
    1      |     1     |    5
    2      |     1     |    4
    2      |     3     |    7
我想制定一个查询,以便我可以返回每个期间的结果,无论它们是否有销售:

Product_ID | Product_Code | Period_ID | Period_Name | Sales
-----------------------------------------------------------
    1      |     ABC      |     1     |    Jan      |   5
    1      |     ABC      |     2     |    Feb      |   0
    1      |     ABC      |     3     |    Mar      |   0 
    2      |     XYZ      |     1     |    Jan      |   4
    2      |     XYZ      |     2     |    Feb      |   0 
    2      |     XYZ      |     3     |    Mar      |   7
我需要查询尽可能通用,它将需要对Firebird 1.5和MS SQL工作。如果不可能,则首选MS SQL

其次,如果某个期间的销售表中有超过1个条目,那么是否可以对总数进行合计?即:

Product_ID | Period_ID | Sales
------------------------------
    1      |     1     |    1
    1      |     1     |    1
会回来吗

Product_ID | Period_ID | Sales
------------------------------
    1      |     1     |    4
那一行


我已尝试进行联接,但看不到如何使其联接每个产品的周期表中的信息。

使用左联接。差不多

SELECT a.*, b.* FROM master AS a LEFT JOIN sales AS b ON (a.Period_ID = b.Period_ID)
您需要首先交叉连接财务表和产品表,以获得期间和产品的所有可能组合。然后对Sales进行左连接和求和,以获得所需的结果:


很抱歉,这只加入product and sales表并忽略缺少的句点。谢谢,这对MS SQL有效。Firebird 1.5没有交叉连接命令,有没有更不可知的方法?此外,这方面最好的指数优化方法是什么,它第一次运行得相当慢。而不是交叉连接尝试:从财务f,产品p,或从财务f内部连接产品p在1=1。第二种方法运行得很好,它实际上运行得更快,但执行计划复杂得多。
SELECT
    p.ID AS Product_ID,
    p.Code AS Product_Code,
    f.ID AS Period_ID,
    f.Period AS Period_ID,
    SUM(COALESCE(s.Sales, 0)) AS Sales
FROM Financials f
CROSS JOIN Product p
LEFT JOIN Sales s
    ON s.Period_ID = f.ID
    AND s.Product_ID = p.ID
GROUP BY
    p.ID, p.Code, f.ID, f.Period
ORDER BY
    p.ID, f.ID