我遇到了一个问题,因为我试图在内连接中进行显式连接,我试图从另一个表中选择某些值。
我的SQL:
SELECT A.OrderID
, A.ItemID
, A.Line
, B.LID
, B.Quantity
FROM Sales A
INNER JOIN (SELECT X.OrderID
, X.Line
, SUM(X.Quantity) AS Quantity
, X.DestinationID
, X.SerialNum
FROM SalesDetail X
WHERE X.OrderID = A.OrderID
GROUP BY X.OrderID, X.Line, X.DestinationID, X.SerialNum
) AS C
ON A.Line = C.Line
AND B.Quantity = C.Quantity
AND B.SerialNum = C.SerialNum
INNER JOIN SalesContents B
ON A.OrderID = B.OrderID
AND A.ItemID = B.ItemID
WHERE A.OrderID = '12345'
AND A.ItemID = 'ABC123';
现在我可以删除X表中的WHERE子句并在内连接中对其进行过滤,但我想在查询值时立即对其进行过滤。有没有办法重写这个语句,以便可以解决未绑定的标识符?
答案 0 :(得分:1)
您无法在未定义的联接中引用别名。
如果你最后只使用子查询,那么你可以将它加入别名C
,像......一样......
SELECT A.OrderID
, A.ItemID
, A.Line
, B.LID
, B.Quantity
FROM Sales A
INNER JOIN SalesContents B
ON A.OrderID = B.OrderID
AND A.ItemID = B.ItemID
INNER JOIN (SELECT X.OrderID
, X.Line
, SUM(X.Quantity) AS Quantity
, X.DestinationID
, X.SerialNum
FROM SalesDetail X
WHERE X.OrderID = A.OrderID
GROUP BY X.OrderID, X.Line, X.DestinationID, X.SerialNum
) AS C
ON A.Line = C.Line
AND B.Quantity = C.Quantity
AND B.SerialNum = C.SerialNum
WHERE A.OrderID = '12345'
AND A.ItemID = 'ABC123';
答案 1 :(得分:0)
将子查询的WHERE子句移动到join的ON子句。别名“A”未在子查询中定义。
SELECT A.OrderID
, A.ItemID
, A.Line
, B.LID
, B.Quantity
FROM Sales A
INNER JOIN (SELECT X.OrderID
, X.Line
, SUM(X.Quantity) AS Quantity
, X.DestinationID
, X.SerialNum
FROM SalesDetail X
--WHERE X.OrderID = A.OrderID
GROUP BY X.OrderID, X.Line, X.DestinationID, X.SerialNum
) AS C
ON A.Line = C.Line
AND C.OrderID = A.OrderID --<-- move the filter here
AND B.Quantity = C.Quantity
AND B.SerialNum = C.SerialNum
INNER JOIN SalesContents B
ON A.OrderID = B.OrderID
AND A.ItemID = B.ItemID
WHERE A.OrderID = '12345'
-- you could also put it here instead
AND A.ItemID = 'ABC123';