これは私の大きな問題のスリム化されたクエリですが、要点は、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
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
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