2016-06-28 8 views
-1

私ができる限り最適化しようとしているクエリがあります。現在のものの代わりにジョインを使うことができますどこに)。T-SQL JOIN /別の結果を返す場所

現在、私のクエリは次のとおりです。

SELECT 
cus.* 
, com.COM_ID 
, cha.CHA_NAME 
FROM thing.dbo.VIEW_REPORT cus --View 
LEFT JOIN otherthing.dbo.TBL_COMMUNICATION com 
ON com.REC_ID = cus.REC_ID 
AND com.RUN_ID = cus.RUN_ID 
LEFT JOIN otherthing.dbo.TBL_CHANNEL cha 
ON cha.CHA_ID = com.CHA_ID 
WHERE com.COM_ID in (
    SELECT eve.COM_ID 
    FROM otherthing.dbo.TBL_EVENT eve) 

私はではなくTBL_EVENTために参加することによってこれを最適化しようとしているWHERE IN(私は、彼らが同じように実行して読んで信じて、私も欲しいですいくつかのTBL_EVENT列を選択して参加してください)。私はインナーそれだけTBL_COMMUNICATIONとTBL_EVENTの両方にある結果を返すだろうことを意味する参加使って考え出し

SELECT 
cus.* 
, com.COM_ID 
, cha.CHA_NAME 
FROM thing.dbo.VIEW_REPORT cus --View 
LEFT JOIN otherthing.dbo.TBL_COMMUNICATION com 
ON com.REC_ID = cus.REC_ID 
AND com.RUN_ID = cus.RUN_ID 
LEFT JOIN otherthing.dbo.TBL_CHANNEL cha 
ON cha.CHA_ID = com.CHA_ID 
INNER JOIN otherthing.dbo.TBL_EVENT eve 
ON com.COM_ID = eve.COM_ID 

:私の新しいクエリは、このようなものです。 これは物事が奇妙になる場所です。

元のクエリ(上部)は約200,000レコードを返します。私の新しいクエリは約1,100,000レコードを返します。しかし、私の見解では同じクエリなので、何が間違っているのか分かりません。 INNER JOINを他の左の結合の上にTBL_EVENTに移動しましたが、違いはありません。

TBL_EVENTに参加して同じデータを返すために何をすべきか教えてください。彼らは

WHERE com.COM_ID in (
    SELECT eve.COM_ID 
    FROM otherthing.dbo.TBL_EVENT eve) 

同じではありません

+2

を投稿するには、行動に参加します。 – jarlh

+0

COM_ID = 'Z'で、テーブル2に* 4 *レコードがあり、COM_ID = 'Z'であれば* 3 *レコードが存在する場合は、結果は3 x 4レコード= * 12 *レコードになります。どちらの表でもCOM_IDは一意ですか? –

+0

COM_IDはTBL_COMMUNICATIONでユニークです。私はあなたが言っていることを理解しているので、今はSELECT DISTINCTを試しています。理論的には同じ量を返すべきです。 (つまり、正しい量) –

答えて

1

はcom.COM_IDがサブクエリの結果で発見されなければならないことを言います。しかし、

INNER JOIN otherthing.dbo.TBL_EVENT eve 
    ON com.COM_ID = eve.COM_ID 

は、eve.COM_IDがcom.COM_IDと同じであるすべての投稿に参加すると言います。

eve.COM_IDに同じCOM_IDの投稿が複数ある場合は、結果に複数の投稿が表示されます。

0

ここには何も変わっていませんが、それはVIEW_REPORTとTBL_COMMUNICATIONの結合の1行でTBL_EVENTの一致に1つ以上の行があるときに起こります。

あなたは、あなたのスクリプトの速度を向上させることは、以下のようなSQLを最適化することができ、最初のと同じ結果

を得る代わりに、あなたの最初のを再利用するために、あなたの2番目のスクリプトのように最適化することはできません

SELECT 
cus.* 
, com.COM_ID 
, cha.CHA_NAME 
FROM thing.dbo.VIEW_REPORT cus --View 
LEFT JOIN otherthing.dbo.TBL_COMMUNICATION com 
ON com.REC_ID = cus.REC_ID 
AND com.RUN_ID = cus.RUN_ID 
and com.COM_ID in (
    SELECT distinct eve.COM_ID 
    FROM otherthing.dbo.TBL_EVENT eve) 
LEFT JOIN otherthing.dbo.TBL_CHANNEL cha 
ON cha.CHA_ID = com.CHA_ID 
INNER JOIN otherthing.dbo.TBL_EVENT eve 
ON com.COM_ID = eve.COM_ID 

または

SELECT 
cus.* 
, com.COM_ID 
, cha.CHA_NAME 
FROM thing.dbo.VIEW_REPORT cus --View 
LEFT JOIN (SELECT * FROM otherthing.dbo.TBL_COMMUNICATION com WHERE com.COM_ID IN (SELECT distinct eve.COM_ID FROM otherthing.dbo.TBL_EVENT eve)) com 
ON com.REC_ID = cus.REC_ID 
AND com.RUN_ID = cus.RUN_ID 
LEFT JOIN otherthing.dbo.TBL_CHANNEL cha 
ON cha.CHA_ID = com.CHA_ID 
+0

TBL_EVENTには何百万ものレコードがあります(そしてTBL_COMMUNICATIONには数百万ものレコードがあります)ので、結合の方が良いと思っていますか? –

0

あなたはLEFT JOIN otherthing.dbo.TBL_COMMUNICATION comをどこで殺していましたか。これにより、別の回答が得られます。最初の答えが気に入ったら、それを通常の参加に変更してください。

SELECT cus.*, com.COM_ID, cha.CHA_NAME 
FROM thing.dbo.VIEW_REPORT cus --View 
LEFT JOIN otherthing.dbo.TBL_COMMUNICATION com 
     ON com.REC_ID = cus.REC_ID 
     AND com.RUN_ID = cus.RUN_ID 
     AND exists (SELECT 1 
        FROM otherthing.dbo.TBL_EVENT eve 
        where eve.COM_ID = com.COM_ID) 
LEFT JOIN otherthing.dbo.TBL_CHANNEL cha 
     ON cha.CHA_ID = com.CHA_ID 

しかし、このクエリはわかりません。
なぜ、左結合の右側を制限しますか?
これが内部結合であることは間違いありません。

SELECT cus.*, com.COM_ID, cha.CHA_NAME 
FROM thing.dbo.VIEW_REPORT cus --View 
JOIN otherthing.dbo.TBL_COMMUNICATION com 
     ON com.REC_ID = cus.REC_ID 
     AND com.RUN_ID = cus.RUN_ID 
     AND exists (SELECT 1 
        FROM otherthing.dbo.TBL_EVENT eve 
        where eve.COM_ID = com.COM_ID) 
LEFT JOIN otherthing.dbo.TBL_CHANNEL cha 
     ON cha.CHA_ID = com.CHA_ID 

`join`を去ったとき、真の左を取得するために` on`の句で右サイドテーブルの条件を入れて、クエリプラン

関連する問題