SQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据

Posted

技术标签:

【中文标题】SQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据【英文标题】:SQL to fetch data where Unique key matches but the data is different in some other columns between different tables 【发布时间】:2018-11-14 13:06:15 【问题描述】:

我有两个结构相同的表,如下所示。我正在尝试编写一个查询来使用作为第一列的唯一键比较两个表,并在第二列中存在不匹配时尝试返回值。 如果密钥不存在,则无需考虑该数据。仅当两个表中都存在密钥时,我们才对其进行比较。

Table A  
ColumnA ColumnB  
A         1  
B         2  
C         2  
D         8  

Table B  
ColumnC ColumnD  
A         1  
B         3  
C         5  
F         4  

例如上表比较表A和B时的输出应该是

B         2
C         2

当将表 B 与 A 进行比较时,它应该是

B         3
C         5

理想情况下,基表应该会有所不同。 我已经尝试过 Joins 和 Unions,但我无法获取上述数据。

【问题讨论】:

提示:INNER JOIN. 谢谢@GordonLinoff !!!对实现联合和连接感到困惑。简单的连接帮助了我。 【参考方案1】: 由于您只需要在两个表中具有匹配 FK 值的行,我们只需使用 INNER JOIN。 现在,我们可以使用WHERE .. <> .. 简单地考虑不匹配的行

比较表 A 和表 B 时,我们只能得到表 A 的行:

SELECT
 tA.* 
FROM tableA AS tA
JOIN tableB AS tB 
  ON tB.ColumnC = tA.ColumnA
WHERE tB.ColumnD <> tA.ColumnB

在比较表 B 和表 A 时,只需从表 B 中获取行:

SELECT
 tB.* 
FROM tableA AS tA
JOIN tableB AS tB 
  ON tB.ColumnC = tA.ColumnA
WHERE tB.ColumnD <> tA.ColumnB

【讨论】:

【参考方案2】:

我愿意:

SELECT t.*
FROM tablea t
WHERE EXISTS (SELECT 1 FROM tableb t1 WHERE t1.cola = t.cola AND t1.colb <> t.cold);

第二个版本也一样,只需要刷表名。

【讨论】:

【参考方案3】:

使用 EXISTS 并合并所有

SELECT t.*
FROM tablea t
WHERE EXISTS (SELECT 1 FROM tableb t1 WHERE t1.cola = t.cola AND t1.colb <> t.colb)
union all    
SELECT t.*
FROM tableb t
WHERE EXISTS (SELECT 1 FROM tablea t1 WHERE t1.cola = t.cola AND t1.colb <> t.colb)

【讨论】:

以上是关于SQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 唯一键,主键和外键

SQL基础:数据表的创建

SQL获取第一个匹配的行

雪花,获取两个表之间不匹配列的列表(SQL)

从表连接中获取唯一的数据对

mysql 5.7 使用主键约束