このOR結合には時間がかかります。私はこの参加を避ける必要があります提案してください。参加条件を変更する方法を提案してください。 JOINのOR条件を置き換える必要があります
Select * from [A] a
LEFT JOIN [B] b
ON A.ID = b.ID OR a.ID = b.ID_REF
このOR結合には時間がかかります。私はこの参加を避ける必要があります提案してください。参加条件を変更する方法を提案してください。 JOINのOR条件を置き換える必要があります
Select * from [A] a
LEFT JOIN [B] b
ON A.ID = b.ID OR a.ID = b.ID_REF
質問は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.ID
はb.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;
テーブル、インデックスなどについての情報がなくても、これは当然不完全な回答になります。 、
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
私は真剣にあなたが与えるいくつかのダミーデータを、供給検討することをお勧めしテーブルの構造以外の実際のデータベースについては何もありません。それは私の意見では、より良い答えを得ることができる唯一の方法です。
この情報でどのように回答が得られますか?私たちはあなたのデータベースを知らないので、どの結合条件を使用すべきかをどのように知ることができますか? – HoneyBadger
'OR'が*正しい*ならば、私たちが期待していることがわかりません。特に修正がクエリを変更すると思われる場合は、クエリ計画の検証、欠落しているインデックスの特定など。 –
SQL SERVERデータベース。私はテーブルの詳細を共有することができません – Gajanan