原谅我添加了另一个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
我们可以将多个Sales
和Potentials
与一个Quarter-Review
配对相关联,但只有一个Sale
和一个Potential
会IsArchived = 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的行
答案 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