私は2つのテーブルを持っています:
CREATE TABLE plans
(id int, benefit varchar(5), clip_state int);
INSERT INTO plans
(id, benefit, clip_state)
VALUES
(1, 'A', 1),
(2, 'A', 0),
(3, 'B', 0),
(4, 'C', 0);
CREATE TABLE clip_states
(state varchar(2), clip_state int);
INSERT INTO clip_states
(state, clip_state)
VALUES
('LA', 1),
('FL', 0);
clip_state
は 0 または 1 のいずれかであり、データ モデルでは2 つの情報からテーブル内のプランを1 つまたは 1 つも照会できないことに注意してください: & 。まず、条件を使用して、テーブルを最大 2 行 (1 行は= 0、もう 1 行は = 1) にフィルター処理できます。次に、使用してテーブルと結合することにより、次のチェックにより結果を 1 行 (またはゼロ) に減らすことができます。plans
benefit
state
benefit
plans
clip_state
state
clip_states
state
がテーブルにある場合は、が 2 つのテーブル間で一致しclip_states
ていることを確認してください。clip_state
一致しない場合、結果は返されません。state
にが存在しない場合は、= 0を持つテーブルclip_states
内の行とのみ一致します。plans
clip_state
トリックを行う私のクエリは次のとおりです。
SELECT id, p.clip_state, benefit
FROM plans p
LEFT JOIN clip_states cs ON STATE IN ('LA')
WHERE benefit = 'A' AND
(p.clip_state = cs.clip_state OR (p.clip_state = 0 AND cs.clip_state IS NULL));
ご覧のとおり、左結合は 2 つのテーブル間の関係で結合されないため、非常に奇妙です。だから、私の質問は:
- このような結合があるのは普通ですか?
- より良い解決策 (クリーン & パフォーマンス) はありますか?
私のソリューションはhttp://sqlfiddle.com/#!1/8912d/53で確認できます。
更新 1: 上記の質問のテキストを更新しました。
更新 2: 詳細情報
- aがテーブルに
state
ない場合、暗黙的に 0 に等しくなります。それ以外の場合は、テーブル内にあります。clip_states
clip_state
clip_state
- 与えられた 2 つの info:
benefit
とから、与えられた の=である表state
の行を見つけます。もちろん、一致しない場合、行は返されません。plans
plans.clip_state
clip_state
state