【问题标题】:SQL to fetch data where Unique key matches but the data is different in some other columns between different tablesSQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据
【发布时间】: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 !!!对实现联合和连接感到困惑。简单的连接帮助了我。

标签: mysql sql


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-07
        • 2021-03-29
        • 2021-04-24
        • 1970-01-01
        • 2016-12-11
        • 2021-12-17
        • 2020-11-16
        • 1970-01-01
        相关资源
        最近更新 更多