我有 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。然后通过使用和连接表,我们可以通过检查将结果减少到一行(或零):plansbenefitstatebenefitplansclip_statestateclip_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中找到一行。当然,如果不匹配,则不会返回任何行。plansplans.clip_stateclip_statestate