SQL:查找具有非唯一特征 ID 的两个表之间的差异?

Posted

技术标签:

【中文标题】SQL:查找具有非唯一特征 ID 的两个表之间的差异?【英文标题】:SQL: Find diff between two tables with non-unique feature IDs? 【发布时间】:2016-04-29 15:37:32 【问题描述】:

我有两个表,它们都有相同的两列:特征 ID 和语言。我想提取功能 ID 的语言已更改的记录。但是,问题在于每个功能 ID 都有多种语言。我的表格如下所示:

表 1

Feature ID  | Language
------------------------
001         | 'en'
001         | 'es'
001         | 'pt'
002         | 'es'
002         | 'fr'

表 2

Feature ID  | Language
-----------------------
001         | 'es'
001         | 'en
001         | 'fr'
002         | 'fr'
002         | 'es'

我最初尝试过类似的方法:

SELECT a.feature_id, b.feature_id, a.language, b.language 
FROM table 1 a FULL OUTER JOIN table 2 b on a.feature_id = b.feature_id 
WHERE a.language <> b.language

但这并没有像我希望的那样工作。我注意到如下结果:

002 | 002 | 'fr' | 'es'
002 | 002 | 'es' | 'fr'

SQL 中有没有办法缓解这种情况?

谢谢。

【问题讨论】:

您使用的是哪个 DBMS? 【参考方案1】:
SELECT a.feature_id, b.feature_id, a.language, b.language
FROM [table 1] a FULL OUTER JOIN [table 2] b on a.feature_id = b.feature_id 
    and a.language = b.language
WHERE a.feature_id is null or b.feature_id is null

将其更改为语言和功能的完全外连接,然后使用 where 子句过滤到没有匹配的行。

【讨论】:

【参考方案2】:

您可以尝试在 featureID 和 Language 上执行 TABLE1 LEFT JOIN TABLE2。那么如果 TABLE2 中的语言语言将为 NULL,则它已更改。

【讨论】:

【参考方案3】:

试试这个:

SELECT a.feature_id, b.feature_id, a.language, b.language 
FROM table 1 a FULL OUTER JOIN table 2 b on a.feature_id = b.feature_id 
WHERE a.feature_id || a.language <> b.feature_id || b.language 

或者:

SELECT a.feature_id, b.feature_id, a.language, b.language 
FROM table 1 a LEFT OUTER JOIN table 2 b 
on a.feature_id || a.language <> b.feature_id || b.language  
WHERE b.feature_id is NULL

【讨论】:

以上是关于SQL:查找具有非唯一特征 ID 的两个表之间的差异?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 非唯一表别名在一个 Select 中

来自具有非唯一 ID 的表的 JPA 实体

找到 2 个具有非唯一 ID 的元素

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

在 SQL 中查找表之间缺失的数字

SQL:在一个列中查找在另一列中也不唯一的非唯一记录