【问题标题】:TSQL multi-part identifier could not be bound (explicit join for select x table in inner join)无法绑定 TSQL 多部分标识符(内部联接中选择 x 表的显式联接)
【发布时间】:2016-06-28 00:06:59
【问题描述】:

我遇到了一个问题,因为我试图在内部联接中进行显式联接,我试图从另一个表中选择某些值。

我的 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 子句并在内连接中过滤它,但我想在查询值时正确过滤它。有没有办法重写这个语句,以便可以解决未绑定的标识符?

【问题讨论】:

  • 只需将条件AND B.Quantity = C.Quantity AND B.SerialNum = C.SerialNum 移动到join SalesContents B(别名)之后。
  • 您的查询毫无意义。连接条件在定义之前引用表别名。我发现对表别名使用表缩写很有帮助(例如,s 表示 sales 而不是 a)。如果您修复查询以正确排序条件并删除子查询中的where 子句,您也许可以自己修复查询。

标签: sql sql-server tsql


【解决方案1】:

您不能在未定义的联接中引用别名。

如果您只在最后获取子查询,那么您可以将其加入 Alias 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';

【讨论】:

  • 您仍在子查询中引用 A
【解决方案2】:

将子查询的 WHERE 子句移至连接的 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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多