2011-07-26 5 views
1

使用:SQL ServerSQLの質問 - 外部結合が機能していないようです

これは私が達成しようとしているものです。私は70社(会社情報など)とその会社のインシデント番号を記録した1つのテーブルで2つのテーブルを持っています。

私は一致が見つかったかどうかすべての会社名を返すように私のSQL結果が好きです。 ===

.....

私が参加いっぱい試してみましたが、アウター・ジョイン、参加左、同じ結果:私は、外側は助けるが、それは私の句が起きてからこれを防止する場合のように見えるだろうと思っ参加します=>しかしwhere句を削除すると、すべての企業名が得られます。私はあなたの例では、私はあなたが実際にこれをしたいかなり確信している列を保持している関係がわからない場合でも

SELECT count(*) AS total_num, TS_NAME 
FROM TTS_INCIDENTS RIGHT OUTER JOIN TS_COMPANIES 
ON TS_COMPANIES.TS_ID=TTS_INCIDENTS.TS_COMPANYID 
WHERE TS_ACTIVEINACTIVE = 0 AND (TS_INCIDENTTYPE=10 OR TS_INCIDENTTYPE=11) 
GROUP BY TS_NAME 
ORDER BY TS_NAME 

おかげ ブルース

+0

「where where clauseを削除したら」という手がかりです。 WHERE句はOUTER JOINの後に適用されるため、NULLにも適用されます。 NULLを処理するために再コーディングするか、単に条件をJOINに移動します。 – MatBailie

答えて

4

FROM TS_COMPANIES LEFT OUTER JOIN TTS_INCIDENTS 
    ON TS_COMPANIES.TS_ID = TTS_INCIDENTS.TS_COMPANYID 
AND TS_ACTIVEINACTIVE = 0 
AND (TS_INCIDENTTYPE = 10 OR TS_INCIDENTTYPE = 11) 

すなわちインシデント述語を選択基準としてではなく、左外部結合基準として使用して、企業から選択し、社外に参加するインシデントを企業に残します。

注意、ほとんどのRDBMSで、 RIGHT OUTER JOINは、通常は重いパフォーマンスへの影響を持っているし、可能 場合は避けるべきである(私はこれを読んだところは覚えていない。時代遅れの事実もあります)。

+0

+1を交換する場合は、最初に –

+0

+1としてください。あなたはとても速いです:) – a1ex07

+0

RIGHT OUTER JOINがLEFT OUTER JOINよりもパフォーマンスが悪いことを示唆しているか、単に外部結合が内部結合よりも悪いことを示唆していますか?あなたが前者を示唆しているのであれば、私はそれが信じられないように聞こえることを本当に参考にしたいと思っています。公平であるために、私は常にLEFT OUTER JOINを読みやすくするために使用しますが、パフォーマンス上の理由では使用しません。 –

0

あなたは修正に作る必要があります。

  • 変更LEFT JOINからRIGHT OUTER JOIN
  • は、WHERE句、あなたが今それを持っているとして参加し、代わりにすべての事件、すべての企業に優先順位を置くために起こっている修正

OR TTS_INCIDENTS.TS_COMPANYID is nullを追加します。
WHERE句を変更すると、NO INCIDENTSのないComapniesもリストに表示されます。

+0

'where'節の' is null'チェックは、述語を結合条件に移動するよりも読みにくいです... IMO –

+0

さらに重要なことは、外部結合を使用すると、結合条件の述語が、一致しない行のために、WHERE節の述部とは異なる結果セット。 –

+0

@ルーカス - これは個人的なスタイルであり、ベストプラクティスではありません。私は彼がJOINまたはWHEREを使用するかどうかは気にしません - しかし、彼はもともとどこで使用していたので、私はちょうどそれに固執しました。 – Chains

0

WHERE句がJOINの外部テーブルと照合される場合、JOINは事実上非常に一般的な間違いです。テーブルを修飾しないため、WHERE句の条件がどのテーブルに作用するのかを判断するのは難しいです。

しかし、私の推測では、WHERE句をJOINの条件にする必要があります。このようなもの:

SELECT 
    count(*) AS total_num, 
    TS_NAME 
FROM 
    TTS_INCIDENTS 
    LEFT OUTER JOIN TS_COMPANIES ON 
     TS_COMPANIES.TS_ID=TTS_INCIDENTS.TS_COMPANYID 
     AND TS_ACTIVEINACTIVE = 0 AND (TS_INCIDENTTYPE=10 OR TS_INCIDENTTYPE=11) 
GROUP BY 
    TS_NAME 
ORDER BY 
    TS_NAME 
関連する問題