除了它在其他 2 个表中退出
Posted
技术标签:
【中文标题】除了它在其他 2 个表中退出【英文标题】:EXCEPT it exits in 2 other tables 【发布时间】:2015-09-07 16:21:00 【问题描述】:我需要从 table product 获取所有值,除了它们在其他 2 个 table products 中存在。使用 2 EXCEPTS 可以接受此查询吗?这是否应该以不同的方式进行。
CREATE table missing_values
AS
select post
from product
EXCEPT
select post
from product_table_a
EXCEPT
select post
from product_table_b
;
【问题讨论】:
您的问题不清楚。如果product
中存在一个值,并且其他两个表中只有一个,那么您的查询是否应该排除它?还是仅在其他两个表中都存在时才应将其排除?还有你自己试过了吗?
@JuanCarlosOropeza - 请不要进行没有实质利益的编辑。
@MatBailie - 如果在 product_table_a 或 product_table_b 中找不到产品表中的值,则应将其添加到正在创建的 missing_values 表中,就是这样。
x-发布到dba.stackexchange.com/q/114370/7788
@Craig Ringer。右首张贴在dba,没有观众。比张贴在这里。感谢您的关注
【参考方案1】:
正如 MatBailie 所说,您应该尝试查询,看看是否能得到您想要的结果。
但如果这不起作用,您可以使用双 not exists
解决它
这意味着在p2
或p3
中都找不到p1
。
SELECT post
FROM product p1
WHERE not exists (SELECT p2.post
FROM product_table_a p2
WHERE p1.post = p2.post)
AND not exists (SELECT p3.post
FROM product_table_b p3
WHERE p1.post = p3.post)
这可能是一种更有效的方式
SELECT post
FROM product p1
left join product_table_a p2
on p1.post = p2.post
left join product_table_b p3
on p1.post = p3.post
WHERE p2.post is null
and p3.post is null
【讨论】:
usingLEFT JOIN/IS NULL
is no more or less efficient in Postgresql 比使用 NOT EXISTS
更有价值
@GarethD 我不知道。
@JuanCarlosOropeza 是的。查询计划器通常为任一表单生成相同的计划。【参考方案2】:
A
- B
- C
等同于A
- (B
+ c
):
SELECT post
FROM product
EXCEPT
(
SELECT post
FROM product_table_a
UNION ALL
SELECT post
FROM product_table_b
) AS sum;
【讨论】:
只是想知道。有任何理由使用union all
而不是 union
吗?
@JuanCarlosOropeza UNION ALL
更快,不需要排序以上是关于除了它在其他 2 个表中退出的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?