Sql 这是:为什么“如果不匹配,则不返回行”和“隐式等于0”同时处于活动状态?它要么是无行,要么是基于隐式默认值的行。这或多或少是我针对单个状态提出的。我使用了cs的顺序。state是NULL DESC,我将OP的保留在中,尽管这个解决方案显然只在单个状态下才最
Sql 这是:为什么“如果不匹配,则不返回行”和“隐式等于0”同时处于活动状态?它要么是无行,要么是基于隐式默认值的行。这或多或少是我针对单个状态提出的。我使用了cs的顺序。state是NULL DESC,我将OP的保留在中,尽管这个解决方案显然只在单个状态下才最,sql,database,postgresql,left-join,Sql,Database,Postgresql,Left Join,这是:为什么“如果不匹配,则不返回行”和“隐式等于0”同时处于活动状态?它要么是无行,要么是基于隐式默认值的行。这或多或少是我针对单个状态提出的。我使用了cs的顺序。state是NULL DESC,我将OP的保留在中,尽管这个解决方案显然只在单个状态下才最有意义,所以我完全同意您切换到=。是的,这对于我给出的所有测试用例都是正确的。不幸的是,如果(利益,状态)是(“B”,“LA”),那么它就失败了。看,这不像它的外表那么简单。这就是为什么我要做一个奇怪的加入。对不起,我不知道怎么会失败。在我看来
这是:为什么“如果不匹配,则不返回行”和“隐式等于0”同时处于活动状态?它要么是无行,要么是基于隐式默认值的行。这或多或少是我针对单个状态提出的。我使用了cs的
顺序。state是NULL DESC
,我将OP的保留在
中,尽管这个解决方案显然只在单个状态下才最有意义,所以我完全同意您切换到=
。是的,这对于我给出的所有测试用例都是正确的。不幸的是,如果(利益,状态)是(“B”,“LA”),那么它就失败了。看,这不像它的外表那么简单。这就是为什么我要做一个奇怪的加入。对不起,我不知道怎么会失败。在我看来它是有效的:因为从plans表返回的行的clip_state=0,而'LA'的clip_state为1。在这种情况下,它不应返回任何行。请阅读我的最新更新。对不起,它不正确。请参阅:它不应返回任何行。顺便说一句,一旦你有了解决方案,请与我的解决方案进行比较,因为我需要选择更好的解决方案。这适用于我能想到的所有测试用例。它与我的解决方案相比如何?(我不是db的人)恐怕帮不了你。我是开发人员,不是DBA。目前不太擅长查询调优/分析。此外,这是PostgreSQL,我从未使用过。(如果不是因为SQLFiddle,我实际上没有地方测试这个。)对不起。
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);
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));
SELECT id, p.benefit, coalesce(cs.clip_state, 0) clip_state
FROM plans p
LEFT JOIN clip_states cs ON cs.clip_state=p.clip_state AND cs.state IN ('LA')
WHERE p.benefit = 'A';
SELECT * FROM stateview WHERE state='FL'
SELECT p.*
FROM plans p
WHERE p.benefit = 'A'
AND NOT EXISTS (
SELECT 1
FROM clip_states cs
WHERE cs.state = 'LA'
AND cs.clip_state <> p.clip_state
)
ORDER BY p.clip_state
LIMIT 1;
SELECT p.*
FROM plans p
INNER JOIN (
SELECT state, clip_state FROM clip_states
UNION ALL
(
SELECT 'LA', 0
EXCEPT
SELECT state, 0 FROM clip_states
)
) cs
ON p.clip_state = cs.clip_state
WHERE p.benefit = 'A'
AND cs.state = 'LA'
;
SELECT *
FROM (
SELECT DISTINCT id, clip_state, benefit
FROM plans
WHERE benefit = 'A') p
LEFT JOIN clip_states cs ON state IN ('LA')
WHERE (p.clip_state = cs.clip_state OR (p.clip_state = 0 AND cs.clip_state IS NULL));