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 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据的主要内容,如果未能解决你的问题,请参考以下文章