web-dev-qa-db-ja.com

内側のselectステートメントのwhere句が外側のselectを参照するselectステートメントへの内部結合?

これは私の大きな問題のスリム化されたクエリですが、要点は、selectが外部のselectによって制限されているselectに内部結合しようとしていることです。それは可能ですか?内部選択でマルチパート識別子S.ItemおよびS.SerialNumに関するエラーが発生します。

要点はこれです。アイテム/シリアルごとにグループ化する必要があり、クエリは十分に大きいため、このマイナー結合のクエリ全体に戻ってすべてをグループ化する必要はありません。

SELECT S.Item, S.SerialNum, S.ReceiveDate
    FROM SALES S
    INNER JOIN (SELECT W.Item, W.SerialNum, MIN(W.SalesDate)
                    FROM WARRANTY W
                    WHERE W.Item        = S.Item    AND
                          W.SerialNum   = S.SerialNum
                    GROUP BY Item, SerialNum, SalesDate) WW
        ON S.Item = WW.Item AND WW.SerialNum
9
Alex Kwitny

JOINリファレンスが間違った場所にあるようです。

SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    GROUP BY Item, SerialNum
) WW
        ON S.Item = WW.Item 
       AND S.SerialNum = WW.SerialNum

編集、フィルタリングに関するコメントに基づいて、WHERE句を内部SELECTに配置できます。

SELECT S.Item, S.SerialNum, S.ReceiveDate, WW.MinSalesDate
FROM SALES S
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    WHERE yourFilter here
    GROUP BY Item, SerialNum
) WW
        ON S.Item = WW.Item 
       AND S.SerialNum = WW.SerialNum
16
Taryn

JOINの代わりにcommon_table_expressionを試すこともできます。 ここでWITH句を確認してください。

これは次のようなものになる可能性があります。

WITH Warranty_CTE (Item, SerialNum, MinSalesDate)
AS
(
 SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    GROUP BY Item, SerialNum
)
SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN Warranty_CTE  WC
        ON S.Item = WC.Item 
       AND S.SerialNum = WC.SerialNum
2
András Ottó