SQL Server:从多个表引用加入

时间:2016-03-15 23:57:10

标签: sql-server join

原谅我添加了另一个JOIN问题,但是我整天都被难倒了,并且没有能够为此找到一个好的答案。

我试图加入4个表格,如下所示:

QuarterID    ReviewID    SaleID    PotentialID
    1           1           1          1
    1           2           2         null
    1           3         null         2
    1           4         null        null

表中的相关信息如下

出售

  QuarterID
  ReviewID
  IsArchived

潜在

  QuarterID
  ReviewID
  IsArchived

  ID

查看

  ID

我们可以将多个SalesPotentials与一个Quarter-Review配对相关联,但只有一个Sale和一个PotentialIsArchived = 0对于给定的Quarter-Review配对。

SELECT 
    quarter.id    AS QID, 
    review.id     AS RID, 
    Sales.id      AS SID, 
    Potentials.id AS PID 
FROM
    dbo.quarter 
JOIN 
    (SELECT * 
     FROM dbo.sale 
     WHERE isarchived = 0) AS Sales ON Sales.quarterid = quarter.id 
JOIN 
    (SELECT * 
     FROM dbo.potential 
     WHERE isarchived = 0) AS Potentials ON Potentials.quarterid = quarter.id 
JOIN 
    dbo.review ON dbo.review.id = Sales.reviewid   
               AND dbo.review.id = Potentials.reviewid 
ORDER BY 
    quarter.id, rid 

使用上面的内容(我知道有一些不必要的专栏),我设法获得了连接,以便他们获得第一个条件(同一季度和评论中的所有销售和潜力)组合,但我也想看看是否有一个只有销售和没有潜力的季度/评论组合,如果有只有潜力和没有销售的Q / R组合,并且只有每个季度和评论组合,因为那里只有少数具有销售和潜力的Q / R组合,几乎所有的Q / R组合都只有销售或潜力。

我猜总的来说,困难来自于需要从两个中间表中获取连接。我可以轻松地加入Quarter,Sale和Review,但让Potential表加入相同的字段(ReviewID,QuarterID)作为Sale让我只得到AND,而我无法找出OR。我试图在没有任何运气的情况下试图获得正确的序列,并且花了几个小时左右。帮助

- 编辑以包含样本数据 -

Quarter
  ID
  1
  2

Review
  ID     (Other fields, not relevant to join)
  1
  2
  3
  4
  5

Sale
  ID    ReviewID    QuarterID    isArchived (Other fields, not relevant)
  1        1           1            0
  2        2           1            1
  3        2           1            0
  4        1           2            0
  5        5           1            0
  6        5           2            0

Potential
  ID    ReviewID    QuarterID    isArchived (Other fields, not relevant)
  1        1           1            0
  2        3           1            0
  3        4           2            1
  4        4           2            0
  5        5           2            0

加入上面的示例数据,我希望输出看起来像:

QuarterID    ReviewID    SaleID    PotentialID
    1           1          1           1
    1           2          3          null
    1           3         null         2
    1           4         null        null
    1           5          5          null
    2           1          4          null
    2           2         null        null
    2           3         null        null
    2           4         null         4
    2           5          6           5

但我遇到的问题是我只返回第一行和最后一行的行,其中既有销售和潜在的给定Quarter / Review组合,而不是一个或多个可能为null的行

1 个答案:

答案 0 :(得分:1)

不确定我是否正确理解了您的问题(一些示例数据会有所帮助)但我认为您的意思是您需要Quarter和Review的所有组合,然后是Quarter和Review的每个组合的任何相关销售和潜在数据。如果这是您所需要的,请尝试以下查询:

SELECT [Quarter].ID AS QID, Review.ID AS RID, Sales.ID AS SID, Potentials.ID AS PID FROM [Quarter]
CROSS JOIN [Review]
LEFT JOIN (SELECT * FROM Sale WHERE IsArchived = 0) Sales ON [Quarter].ID = Sales.QuarterID AND [Review].ID = Sales.ReviewID
LEFT JOIN (SELECT * FROM Potential WHERE IsArchived = 0) Potentials ON [Quarter].ID = Potentials.QuarterID AND [Review].ID = Potentials.ReviewID