如何在没有主键的情况下从 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 中的两个表中获取不常见的记录的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:比较两个不同表中没有主键的字符串列以查找匹配/不匹配的字符串