2017-03-27 10 views
-1

このOR結合には時間がかかります。私はこの参加を避ける必要があります提案してください。参加条件を変更する方法を提案してください。 JOINのOR条件を置き換える必要があります

Select * from [A] a 
LEFT JOIN [B] b 
ON A.ID = b.ID OR a.ID = b.ID_REF  
+1

この情報でどのように回答が得られますか?私たちはあなたのデータベースを知らないので、どの結合条件を使用すべきかをどのように知ることができますか? – HoneyBadger

+5

'OR'が*正しい*ならば、私たちが期待していることがわかりません。特に修正がクエリを変更すると思われる場合は、クエリ計画の検証、欠落しているインデックスの特定など。 –

+0

SQL SERVERデータベース。私はテーブルの詳細を共有することができません – Gajanan

答えて

2

質問はUNIONで書き直すことができます。最初の条件の結果を取得し、次に2番目の条件の結果を取得し、2つの条件をマージします。

SELECT * FROM [A] a LEFT JOIN [B] b ON a.ID = b.ID 
UNION 
SELECT * FROM [A] a LEFT JOIN [B] b ON a.ID = b.ID_REF; 

これは、しかし、重複を排除するためのタスクの、あなたの元のクエリより遅くなる可能性があります。

重複がない場合(つまり、b.IDb.ID_REFに等しくない場合があります)、または一部を取得しても気にしない場合は、代わりにUNION ALLを使用してください。これは重複を取り除かずに両方の結果を単純に貼り合わせるので、実際にはクエリよりも高速になる可能性があります。 A(ID),B(ID)およびB(ID_REF)にインデックスを設定する必要があります。

SELECT * FROM [A] a LEFT JOIN [B] b ON a.ID = b.ID 
UNION ALL 
SELECT * FROM [A] a LEFT JOIN [B] b ON a.ID = b.ID_REF; 
0

テーブル、インデックスなどについての情報がなくても、これは当然不完全な回答になります。 、

SELECT * 
FROM TableA A 
LEFT JOIN TableB B1 
    ON A.ID = B1.ID 
LEFT JOIN TableB B2 
    ON A.ID = B2.ID_REF 
WHERE COALESCE(B1.ID,B2.ID_REF) = A.ID 
; 

この:そのことについてあなたに警告した、私はあなたがおそらく、このようなものを二つの別々のJOIN条件にこれを分割して、ID分野の重要性/関連性を反映するために、あなたのWHERE句を変更することができることを言うだろうもちろん、重複した行を返す可能性があるという欠点があり、インデックス/キーに応じて元のクエリよりも遅く動作することさえありますが、前述のように、少しでも良い答えを与えるのは難しいでしょうあなたが作業しているスキーマに関する情報。

ただ、これがどのように動作するかをお見せするために、いくつかの超簡単なダミーデータを使用して:

DECLARE @TABLEA TABLE 
    (
     ID INT 
    ); 
DECLARE @TABLEB TABLE 
    (
     ID INT 
     ,ID_REF INT 
    ); 

INSERT INTO @TABLEA 
SELECT 1 
    UNION ALL 
SELECT 2 
    UNION ALL 
SELECT 3 
    UNION ALL 
SELECT 4 
    UNION ALL 
SELECT 5 
    UNION ALL 
SELECT 6 
; 

INSERT INTO @TABLEB (ID, ID_REF) 
SELECT 1,NULL 
    UNION ALL 
SELECT NULL,2 
    UNION ALL 
SELECT 3,3 
    UNION ALL 
SELECT 4,NULL 
    UNION ALL 
SELECT NULL,5 
    UNION ALL 
SELECT 6,NULL 
; 

SELECT 
    A.ID AS [A_ID] 
    ,COALESCE(B1.ID,B2.ID_Ref) AS [B_Final_ID] 
FROM @TABLEA A 
LEFT JOIN @TABLEB B1 
    ON A.ID = B1.ID 
LEFT JOIN @TABLEB B2 
    ON A.ID = B2.ID_REF 
WHERE COALESCE(B1.ID,B2.ID_REF) = A.ID 
; 

戻り値:

A_ID | B_Final_ID 
-----+----------- 
1 | 1 
2 | 2 
3 | 3 
4 | 4 
5 | 5 
6 | 6 

私は真剣にあなたが与えるいくつかのダミーデータを、供給検討することをお勧めしテーブルの構造以外の実際のデータベースについては何もありません。それは私の意見では、より良い答えを得ることができる唯一の方法です。

関連する問題