除了它在其他 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 解决它

这意味着在p2p3 中都找不到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

【讨论】:

using LEFT 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 个表中退出的主要内容,如果未能解决你的问题,请参考以下文章

用于将表与其他 2 个表中的 1 个相关联的数据库设计

如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?

加入3个表,在其他表中有多个值

如何使用 php pdo 中的 2 个表获取 1 个表用户详细信息?

在 SQLite 中同时向 4 个表中插入数据。如何?

Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列