SQL中的表连接问题
我在执行以下联接时遇到问题。我以前遇到过这个问题,使用过临时表,但我想知道我做错了什么。基本上,不工作的生产线是倒数第三条。SQL中的表连接问题,sql,tsql,join,nested-sets,Sql,Tsql,Join,Nested Sets,我在执行以下联接时遇到问题。我以前遇到过这个问题,使用过临时表,但我想知道我做错了什么。基本上,不工作的生产线是倒数第三条。
在旁注中,我还看到人们使用十字架和十字架。不是为了说明这是如何工作的,但可能适用于这里?我认为,尽管尚未测试,但您可以在SQL 2005中将连接更改为交叉应用+
SELECT MID, FAD.FirstOpenedDate ,LCD.LastCloseDate
FROM mwMaster.dbo.Merchant M
JOIN (
SELECT MerchID, MIN(moddate) AS FirstOpenedDate
FROM mwMaster.dbo.MerchantStatusHistory
GROUP BY MerchID
) FAD ON FAD.MerchID = M.MerchID
LEFT JOIN (
SELECT MerchID, MAX(moddate) AS LastCloseDate
FROM mwMaster.dbo.MerchantStatusHistory
GROUP BY MerchID
) LCD ON LCD.MerchID = M.MerchID
JOIN (
SELECT merchid ,avg(Transactions) ,avg(Profit)
FROM mwMaster.dbo.ResidualSummary RS
WHERE RS.Date_Processed < LCD.LastCloseDate
GROUP BY Merchid
) R ON R.MerchID = M.MerchID
但使用CTE可能更容易
SELECT MID, FAD.FirstOpenedDate ,LCD.LastCloseDate
FROM mwMaster.dbo.Merchant M
JOIN (
SELECT MerchID, MIN(moddate) AS FirstOpenedDate
FROM mwMaster.dbo.MerchantStatusHistory
GROUP BY MerchID
) FAD ON FAD.MerchID = M.MerchID
LEFT JOIN (
SELECT MerchID, MAX(moddate) AS LastCloseDate
FROM mwMaster.dbo.MerchantStatusHistory
GROUP BY MerchID
) LCD ON LCD.MerchID = M.MerchID
CROSS APPLY(
SELECT merchid ,avg(Transactions) ,avg(Profit)
FROM mwMaster.dbo.ResidualSummary RS
WHERE RS.Date_Processed < LCD.LastCloseDate
GROUP BY Merchid
) R ON R.MerchID = M.MerchID
没有您的数据,我无法真正测试这一点,但有一种方法可以做到:
WITH LCD AS (SELECT MerchID, MAX(moddate) AS LastCloseDate
FROM mwMaster.dbo.MerchantStatusHistory
GROUP BY MerchID),
R AS (
SELECT merchid ,avg(Transactions) ,avg(Profit)
FROM mwMaster.dbo.ResidualSummary RS
INNER JOIN LCD on
LCD.MERCHID = RS.MERCHID
WHERE RS.Date_Processed < LCD.LastCloseDate
GROUP BY Merchid
)
SELECT MID, FAD.FirstOpenedDate ,LCD.LastCloseDate
FROM mwMaster.dbo.Merchant M
JOIN (
SELECT MerchID, MIN(moddate) AS FirstOpenedDate
FROM mwMaster.dbo.MerchantStatusHistory
GROUP BY MerchID
) FAD ON FAD.MerchID = M.MerchID
LEFT JOIN LCD ON LCD.MerchID = M.MerchID
LEFT JOIN R ON R.MerchID = M.MerchID
你能用通俗易懂的英语解释一下你想在这里实现什么吗?通过使用嵌套查询加入一个表,并在select中的where子句中使用上面创建的表中的一列statment@marc-问题似乎是他想在另一个子查询中使用对子查询的引用,基本上。是否需要最后一次加入?我看不到您引用R子查询中的任何列。@康拉德·弗里克斯:对,但是如果不需要这些列,我们可以消除计算聚合的开销,并可能通过WHERE EXISTS来改进。。。同意,我通常认为CTE是最简单的方法。尽管如此,为什么不在LCD CTE中包含剩余的子选择MINmoddate?联接条件是相同的表和列,左联接与以前需要的联接一样没有意义,可以是相同表/索引查找的一部分。
SELECT MID,
MIN(moddate) OVER (PARTITION BY MerchID) as FirstOpenedDate,
MAX(moddate) OVER (PARTITION BY MerchID) as LastCloseDate
FROM mwMaster.dbo.Merchant
HAVING DateProcessed < LastCloseDate