如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录

Posted

技术标签:

【中文标题】如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录【英文标题】:How to fetch uncommon records from two tables in mySQL without primary key 【发布时间】:2021-12-28 00:25:52 【问题描述】:

我有两个表,都有相同数量的列,但没有一个具有任何主键,如下所示:

表 A

Name Ranking Genre Category Rated
M1 1 Comedy Movie G
M2 2 Action Series PG

表 B

Name Ranking Genre Category Rated
MX1 44 Thriller Series G
M2 2 Action Series PG

我需要从两个表中获取不常见的记录,其中 Ranking 和 Name 组合对它们来说是唯一的。

我尝试过使用左连接和右连接,但它为我提供了任一表中的所有记录。我的首要任务是只获取以下不常见的记录:

Name Ranking Genre Category Rated
M1 1 Comedy Movie G
MX1 44 Thriller Series G

【问题讨论】:

名称或排名可以为空吗? 是的,所有字段都可以为空 【参考方案1】:

您可以合并两个外连接。例如:

select a.*
from a
left join b on a.name = b.name and a.ranking = b.ranking
where b.name is null
union all
select b.*
from b
left join a on a.name = b.name and a.ranking = b.ranking
where a.name is null

【讨论】:

因为名称和排名可以为空,所以应该使用<=>而不是= @ysth 我同意,但对两列的问题点都不是空的,它说“......其中排名和名称组合是唯一的”。但是...除了逻辑上的细微差别,我总是忘记这个运算符,它是标准 IS DISTINCT FROM 的简写。 这是标准的吗?快速尝试一下,这似乎是 postgresql 的事情;我无法让它在 sql server、sqlite、oracle 或 mysql 上工作 通常在加入时,人们不期望 null 匹配;在这里,目标是过滤重复项,而不是实际加入,这是需要考虑的事情(他们确实在评论中确认可能存在空值) 那么,根据 cmets 的说法,是的,你是对的。为了准确起见,IS DISTINCT FROM 在 SQL:1999 的第 8.13 节“不同谓词”中定义。【参考方案2】:

尝试内部连接

SELECT *
FROM table_a
INNER JOIN table_b ON table_a.name = table_b.name AND table_a.ranking = table_b.ranking;

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录的主要内容,如果未能解决你的问题,请参考以下文章

Mysql - 将值插入具有未知主键的多个表中

mysql中添加外键问题,求高手

Oracle:比较两个不同表中没有主键的字符串列以查找匹配/不匹配的字符串

mysql表中一个表中可以有多个主键吗?

MySQL - 如何创建一个新表,该表是两个现有表的主键的连接

维度建模:如何创建没有代理主键的表?