将嵌套查询转换为SQL Server中的联接

时间:2018-12-14 05:43:48

标签: sql sql-server

我有一个查询

SELECT *  
FROM Stops 
WHERE CustomerID IN (SELECT ID FROM Customers WHERE Active = 1) 
  AND DriverID IS NOT NULL 
  AND TripID IN (SELECT ID 
                 FROM Trips 
                 WHERE ManagerID IN (SELECT ID FROM Users WHERE Active = 1) 
                   AND AssignedToID IN (SELECT ID FROM Users WHERE Active = 1) 
                   AND Modified > DATEADD(day, -60, GETDATE()))

我试图转换为Join,但被卡住了

SELECT *  
FROM Stops S  
JOIN Customers C ON C.ID = S.CustomerID
JOIN Trips T ON S.TripID = T.ID 
WHERE C.ACTIVE = 1
  AND S.DriverID IS NOT NULL
  AND T.Modified > DATEADD(day, -60, GETDATE())

3 个答案:

答案 0 :(得分:3)

使用所有联接,没有嵌套查询

SELECT * FROM Stops A
INNER JOIN Customers B ON A.CustomerID = B.ID
INNER JOIN Trips C ON A.TripID = C.ID
INNER JOIN Users D ON C.ManagerID = D.ID
INNER JOIN Users E ON C.AssignedToID = E.ID
WHERE A.DriverID IS NOT NULL AND
B.Active = 1 AND
D.Active = 1 AND
E.Active = 1 AND
C.Modified > DATEADD(day, -60, GETDATE());

如果想要止损的唯一数据,还可以在选择中添加“ DISTINCT”。

答案 1 :(得分:0)

您可以像下面的子查询一样尝试并加入

SELECT S.*  FROM Stops S  
JOIN Customers C ON C.ID=S.CustomerID
join  (SELECT ID FROM Trips  where
            ManagerID IN (SELECT ID FROM Users WHERE Active = 1) AND 
            AssignedToID IN (SELECT ID FROM Users WHERE Active = 1) AND 
            Modified > DATEADD(day, -60, GETDATE())
       ) t on S.TripID=t.ID 

答案 2 :(得分:0)

我正在尝试您的第二个代码,直到出现以下代码。您可以尝试

SELECT *  
FROM Stops S  
JOIN Customers C ON C.ID = S.CustomerID AND C.ACTIVE = 1
JOIN Trips T ON S.TripID = T.ID AND T.Modified > DATEADD(day, -60, GETDATE())
LEFT JOIN Users U ON T.ManagerID = U.ID AND T.AssignedToID = U.ID
WHERE S.DriverID IS NOT NULL

我通常要做的是将正方形绘制为表格,并根据需要链接它们。 不过,仍然不确定我的答案是否可行,因为除了使用JOIN之外,我对您要在代码上实现的目标一无所知。