2016-04-29 61 views
1

我有两个表都具有相同的两列:功能ID和语言。我想提取功能ID的语言已更改的记录。但问题是,每个功能ID都有多种语言。我的表是这样的:SQL:使用非唯一功能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的方式来减轻这种情况?

谢谢。

+0

您正在使用哪些DBMS? –

回答

2
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子句来过滤下来没有那些行比赛。

+1

这对我很有用,它非常简单...谢谢! – Scott

0

您可以尝试执行TABLE1左JOIN TABLE2 ON featureID和Language。那么如果来自TABLE2的语言语言将是NULL,那么它将被改变。

0

试试这个:

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