2012-08-22 15 views
7

これは私の大きな問題のスリムなダウンクエリですが、要点は、選択に内側の結合をしようとしているところです。選択は外側の選択によって制限されています。それは可能ですか?私はマルチセパレータ識別子S.ItemとS.SerialNumについてのエラーを内部セレクトに取得しています。内部選択文のwhere節が外側選択を参照するselect文への内部結合?

要点はこれですが、item/serialでグループ化しなければならず、クエリが十分に大きいので、このマイナー結合のクエリ全体をすべてグループ化したくありません。

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 
+1

..それを 'ON'ステートメントに含めます。内部結合は、WHERE句が実行しようとしていることを自動的に行います。 – StuckAtWork

+0

外部クエリは内部クエリの変数を参照しません。だから、ただフィルターとしての役割を果たすだけです。あなたは外側のクエリにminSalesDateを含めるつもりでしたか? –

+0

@ GordonLinoff私はそれを含めるつもりだった。手でクエリが入力されました。 –

答えて

13

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 

編集、フィルタリングについてコメントをもとに、あなたはあなたの内側のSELECTWHERE句を置くことができます。

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 
+2

また、 'SalesDate'は' GROUP BY'にあってはならず、 'MIN(W.SalesDate)'には別名が必要です。 –

+0

@MartinSmith fixed、thanks – Taryn

+0

私は内部の 'select'ステートメントに' where'節を置くことができませんか?目的は、結果の一部に「Expired」ステータスがあるため、「MIN(EXPIRED)」を追加して「group by」を実行してから、「ON EXPIRED = 0」に参加しました。私はそれができないほど複雑なものがあるのだろうかと思っています。 –

2

あなたが代わりにも、JOINのcommon_table_expressionを試すことができます。 Check the WITH clause here.

それはこのようなものが考えられます。私はあなたがここに求めているものはかなりよく分からない..しかし、そのクエリのルックスから、あなたの内側の `WHERE W.Itemを削除

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

私はこれもショットにするつもりだ。私はそれが上から働いていると思う –

+0

このソリューションの実行計画に関する注意点: このソリューションの計画はbluefeetのソリューションと同じでなければなりません。 (バックグラウンドでは、オプティマイザと同じプロセスです)しかし、私はこのステートメントがより読みやすいと思います。 –

+0

私はもっと読みやすい解決策が好きです。これはどんなに遅いですか? –

関連する問題