2016-06-28 5 views
0

Ich bin auf ein Problem, weil ich versuche, eine explizite Join in einem inneren Join, wo ich versuche, bestimmte Werte zu wählen von einem anderen Tisch.TSQL mehrteilige Bezeichner konnte nicht gebunden werden (explizite Join für SELECT x Tabelle in inneren Join)

My 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'; 

Jetzt kann ich die WHERE-Klausel in der X-Tabelle entfernen und filtere es innerhalb der inneren beitreten, aber ich mag es richtig filtern, wenn ich die Werte am abfragt. Gibt es eine Möglichkeit, diese Anweisung neu zu schreiben, so dass der ungebundene Bezeichner bearbeitet werden kann?

+0

bewegen nur die Bedingungen 'UND B.Quantity = C.Quantity UND B.SerialNum = C.SerialNum' nach' join' SalesContents B (alias). –

+0

Ihre Anfrage ergibt keinen Sinn. Die Join-Bedingungen beziehen sich auf Tabellenaliasnamen, bevor sie definiert werden. Ich finde es hilfreich, Tabellenabkürzungen für die Tabellenaliasnamen zu verwenden (z. B. "s" für "sales" anstatt "a"). Wenn Sie die Abfrage korrigieren, um die Bedingungen korrekt zu ordnen, und die 'where'-Klausel in der Unterabfrage entfernen, können Sie die Abfrage möglicherweise selbst beheben. –

Antwort

0

Bewegen Sie die Unterabfrage der WHERE-Klausel zu den Join der ON-Klausel. Alias ​​'A' ist in Ihrer Unterabfrage nicht definiert.

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'; 
1

Sie können in Ihren Joins keinen Alias ​​verweisen, der nicht definiert wurde.

Wenn Sie die Unterabfrage am Ende nehmen nur dann können Sie verbinden es Alias ​​C, so etwas wie ....

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'; 
+0

Sie verweisen immer noch auf A in der Unterabfrage – Eric

Verwandte Themen