sql在唯一键匹配但不同表之间的其他列中的数据不同的情况下获取数据

owfi6suc  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(247)

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

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

理想情况下,基表中的差异应该出现。我尝试过连接和联合,但无法获取上述数据。

qoefvg9y

qoefvg9y1#

使用存在并联合所有

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)
1tu0hz3e

1tu0hz3e2#

因为您只需要在两个表中都具有匹配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
iecba09b

iecba09b3#

我会做:

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

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

相关问题