我有 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 信息中查询表中的一个或没有计划: & 。首先,使用条件,我们最多可以将表过滤为 2 行,1 行= 0,1 行 = 1。然后通过使用和连接表,我们可以通过检查将结果减少到一行(或零):plans
benefit
state
benefit
plans
clip_state
state
clip_states
- 如果
state
在clip_states
表中,请确保clip_state
在 2 个表之间匹配。如果不匹配,则不返回任何结果。 - 如果
state
中不存在clip_states
,则仅与plans
表中clip_state
= 0 的行匹配。
这是我的查询,可以解决问题:
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));
如您所见,左连接很奇怪,因为它没有连接两个表之间的关系。所以,我的问题是:
- 有这样的加盟是正常的吗?
- 有没有更好的解决方案(清洁和性能)?
您可以在以下位置查看我的解决方案:http ://sqlfiddle.com/#!1/8912d/53
更新1:我已经更新了上面问题的文字。
更新 2:更多信息
- 如果 a
state
不在clip_states
表中,则其clip_state
隐式等于 0。否则,它clip_state
在表中。 - 从两个给定的 info:
benefit
和中,在table where = of that givenstate
中找到一行。当然,如果不匹配,则不会返回任何行。plans
plans.clip_state
clip_state
state