Sql 代码>不存在到存在可以产生任意数量的行
考虑到你是建立在错误的假设之上,我建议你重新评估你的发现,如果可以的话,再来一次 condition_3d和condition_3e将select_2与select_3链接,但这是一个非常松散的耦合,因为优先级_id和名称可能分别链接到不同的博客和标签。在没有看到实际数据的情况下,我建议可能需要通过指定select_2.blog_id=select_3.blog_id(或类似)在select_2和select_3之间建立更紧密的链接 关于您的伪代码,我对代码的内容进行以下解释:Sql 代码>不存在到存在可以产生任意数量的行,sql,postgresql,where,postgresql-9.2,exists,Sql,Postgresql,Where,Postgresql 9.2,Exists,考虑到你是建立在错误的假设之上,我建议你重新评估你的发现,如果可以的话,再来一次 condition_3d和condition_3e将select_2与select_3链接,但这是一个非常松散的耦合,因为优先级_id和名称可能分别链接到不同的博客和标签。在没有看到实际数据的情况下,我建议可能需要通过指定select_2.blog_id=select_3.blog_id(或类似)在select_2和select_3之间建立更紧密的链接 关于您的伪代码,我对代码的内容进行以下解释: 如果有来自org
SELECT count(*) FROM blog_tags AS bt -- add alias
WHERE bt.subscribed = true
AND bt.special = true
AND EXISTS (
SELECT 1
FROM tags AS t1 -- add alias
INNER JOIN blog_tags AS bt1 ON bt1.tag_id = t1.id -- change alias
INNER JOIN blogs AS b1 ON bt1.blog_id = b1.id -- change alias
WHERE b1.org_id = 22
AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
SELECT 1
FROM blog_tags AS bt2 -- change alias
INNER JOIN tags AS t2 ON bt2.tag_id = t2.id -- change alias
INNER JOIN blogs AS b2 ON bt2.blog_id = b2.id -- change alias
WHERE b2.org_id = 4
AND b2.active = true
AND b2.type = 'foo'
AND b2.priority_id = b1.priority_id
AND t2.name = t1.name
)
);
condition_3d和condition_3e将select_2与select_3链接,但这是一个非常松散的耦合,因为优先级_id和名称可能分别链接到不同的博客和标签。在没有看到实际数据的情况下,我建议可能需要通过指定select_2.blog_id=select_3.blog_id(或类似)在select_2和select_3之间建立更紧密的链接
关于您的伪代码,我对代码的内容进行以下解释:
SELECT count(*) FROM blog_tags AS bt -- add alias
WHERE bt.subscribed = true
AND bt.special = true
AND EXISTS (
SELECT 1
FROM tags AS t1 -- add alias
INNER JOIN blog_tags AS bt1 ON bt1.tag_id = t1.id -- change alias
INNER JOIN blogs AS b1 ON bt1.blog_id = b1.id -- change alias
WHERE b1.org_id = 22
AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
SELECT 1
FROM blog_tags AS bt2 -- change alias
INNER JOIN tags AS t2 ON bt2.tag_id = t2.id -- change alias
INNER JOIN blogs AS b2 ON bt2.blog_id = b2.id -- change alias
WHERE b2.org_id = 4
AND b2.active = true
AND b2.type = 'foo'
AND b2.priority_id = b1.priority_id
AND t2.name = t1.name
)
);
这是巧合吗?无论哪种方式,都可能有相同数量的符合条件的行。少量的样本数据来重现问题将是有趣和有用的。您确定连接条件或WHERE子句的其他部分不是问题的根源吗?我的猜测是,
org\u id
从来都不是22。您是否尝试单独运行外部子查询,同时使用exists和not exists?你每次都得到相同数量的行吗?@GordonLinoff:如果org\u id
从来都不是22,那么计数是0,而不是237。这是巧合吗?无论哪种方式,都可能有相同数量的符合条件的行。少量的样本数据来重现问题将是有趣和有用的。您确定连接条件或WHERE子句的其他部分不是问题的根源吗?我的猜测是,org\u id
从来都不是22。您是否尝试单独运行外部子查询,同时使用exists和not exists?你每次都得到相同数量的行吗?@GordonLinoff:Iforg\u id
从不为22,则计数为0,而不是237。
count(*) can only return a non-zero number ...
AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
/* condition_2b (the entire NOT EXISTS inside these parentheses */
/* select_3 */
SELECT 1
FROM sometable1
INNER JOIN join_expression_2a
INNER JOIN join_expression_2b
WHERE condition_3a
AND condition_3b
AND condition_3c
AND condition_3d --- this condition links select_2 to select_3
AND condition_3e --- this condition links select_2 to select_3
)
);
SELECT count(*) FROM blog_tags AS bt -- add alias
WHERE bt.subscribed = true
AND bt.special = true
AND EXISTS (
SELECT 1
FROM tags AS t1 -- add alias
INNER JOIN blog_tags AS bt1 ON bt1.tag_id = t1.id -- change alias
INNER JOIN blogs AS b1 ON bt1.blog_id = b1.id -- change alias
WHERE b1.org_id = 22
AND NOT EXISTS ( /* Removing the "NOT" on this line has no effect */
SELECT 1
FROM blog_tags AS bt2 -- change alias
INNER JOIN tags AS t2 ON bt2.tag_id = t2.id -- change alias
INNER JOIN blogs AS b2 ON bt2.blog_id = b2.id -- change alias
WHERE b2.org_id = 4
AND b2.active = true
AND b2.type = 'foo'
AND b2.priority_id = b1.priority_id
AND t2.name = t1.name
)
);