私はTABLE1の各レコードをTABLE2の多くとも1つのレコードとマッチさせる必要があります。 (CODEの等価性)と貧弱なもの(CODEの等価性がない場合は、CODEでソートしてインデックスで照合してみましょう)を照合するより良い方法があります。JOINの優先順位は?
のは、これを行うコードは次のようになりますことを第一近似として想定してみましょう:
SELECT
TABLE1.CODE AS CODE1,
TABLE2.CODE AS CODE2
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY CODE) INDEX, CODE FROM TABLE1) T1
LEFT JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY CODE) INDEX, CODE FROM TABLE2) T2
ON
(T1.CODE=T2.CODE) --CODE equality
OR
(T1.INDEX=T2.INDEX) --CODE equality
はのは、これらのテーブルを考えてみましょう:
TABLE1 TABLE2
+------+ +------+
| CODE | | CODE |
+------+ +------+
| AAA | | BBB |
| BBB | | CCC |
| CCC | | DDD |
+------+ +------+
結果は以下のようになります。
CODE1 CODE2
----- -----
AAA BBB -> matched because of INDEX equality
BBB BBB -> matched because of CODE equality
BBB CCC -> matched because of INDEX equality
CCC CCC -> matched because of CODE equality
CCC DDD -> matched because of INDEX equality
ここに難しさがあります:私は2つの条件が一致しているにもかかわらず、可能であれば、第1のものを第2のものより優先させなければならず、第2のものはが最初のものに失敗した場合にのみと評価されなければならない。
指名手配結果ビーイング:
CODE1 CODE2
----- -----
AAA DDD -> matched because of INDEX equality between the cast-off records not able to match better
(corrected from the previous version where AAA was said to match expectedly with BBB)
BBB BBB -> matched thanks to CODE equality, no need to match on INDEX
CCC CCC -> matched thanks to CODE equality, no need to match on INDEX
そしてもちろん、私は、好ましくは、いくつかの-のステップのスクリプトを避けるために、オール・イン・ワンの問合せこの挙動を得るだろう、与えられたもの:
あなたはまったく異なった質問を自由に提案することができます:上記は一般的なアイデアを説明するためだけにありましたが、それはニーズに合わないことは明らかです。したがって、その構造を保存しようとする必要はありません。
オールインワン・クエリー・マッチングを実行したいのと比べて、パフォーマンスは本当に気にしません。サブクエリーが必要な場合は、行こう! ;-)
あなたのご意見をお待ちしています! :-)
EDIT:
私は今修正と深く正確な答えとして考えることができるものに変更された私のOPに強いエラーをしました。期待された結果は正しくありませんでした。私の最も謙虚な謝罪。 :-(
アイデアは次のとおりです:CODEの等価性にできるだけ一致させてから、この最初の一致アルゴリズムによって残されたものだけをINDEXでマッチさせることを考えてください。そのため、INDEX-
2番目のサブクエリはTable2ではなくTable1であるべきですか? –
申し訳ありませんが、もちろんそうです。私はOPを修正しました。 – Ssithra
@Ssithra: 'CODE'の2つのフィールドにUNIQUE制約がありますか? –