【问题标题】:Get unique rows of two tables获取两个表的唯一行
【发布时间】:2012-09-13 10:30:43
【问题描述】:

我想比较两个具有相同列但行数不同的表。如何找到每个表的唯一行?我找到了一些连接教程,但它需要主键来连接两个表,我的示例表彼此没有关系。

示例表:

TableA
Id | Name
1 | Person1
2 | Person2
3 | Person3
4 | Person4

TableB
Id | Name
1 | Person1
2 | Person2
4 | Person4

Sample result:
Id | Name
3 | Person3

Optional result:
Id | Name | Table
3 | Person3 | TableA

【问题讨论】:

  • 在某处看到您的评论,您已经提到这两个表彼此没有关系,您仍然可以加入两个表,前提是在 ON 子句中,您必须检查所有的值列到其他表。请参阅下面的答案。

标签: mysql sql join


【解决方案1】:

由于 MySQL 缺少 FULL JOIN,您仍然可以使用 LEFT or RIGHTUNION 连接来模拟它。试试吧,

SELECT  a.* , 'TableA' as `Table`
FROM    tableA a
        LEFT JOIN tableB b
            ON a.id = b.id AND
               a.name = b.name
WHERE   b.id IS NULL
UNION
SELECT  d.*, 'TableB' as `Table`
FROM    tableA c
        RIGHT JOIN tableB d
            ON c.id = d.id AND
               c.name = d.name
WHERE   c.id IS NULL

SQLFiddle Demo

【讨论】:

  • @Blackator 试试这个答案,我在表格上添加了一些行。
【解决方案2】:

此查询使用 UNION 语句从 TableA 中选择不存在于 TableB 中的行以及来自 TableB 中不存在于 TableA 中的行。

SELECT Id, Name, 'TableA' FROM TableA
WHERE (Id, Name) NOT IN
(SELECT Id, Name FROM TableB)
UNION
SELECT Id, Name, 'TableB' FROM TableB
WHERE (Id, Name) NOT IN
(SELECT Id, Name FROM TableA)

【讨论】:

  • 通常最好在代码中添加一些解释,告诉提出问题的人为什么它有效,链接到文档等。还可以帮助您的代码不被低质量的帖子审查系统标记.请参阅@JohnWoo 的答案以了解如何操作。
  • 完美!非常感谢马里亚诺!
  • @CraigRinger 我不能使用 John Woo 的查询,因为它需要来自两个表的关系
  • @CraigRinger 别担心,我能理解马里亚诺的问题,直截了当.. :)
  • @Blackator 不用担心,这确实是 Mariano 在回答时的风格。仅代码帖子会被版主系统标记,并且提供一两行提示通常很有帮助 - 对其他读者,而不仅仅是提出问题的人。
【解决方案3】:
SELECT COLUMN_NAME
FROM information_schema.columns
Where table_name="table_1" AND
COLUMN_NAME NOT IN (
SELECT COLUMN_NAME
FROM information_schema.columns
WHERE table_name="table_2")

我们从第一个表中获取列名,条件是(子查询)在第二个表中没有相同的列(字段)。因此,这为我们提供了第一个表独有的字段,正如您在问题中所希望的那样。

【讨论】:

  • 通常最好在代码中添加一些解释,告诉提出问题的人为什么它有效,链接到文档等。还可以帮助您的代码不被低质量的帖子审查系统标记.请参阅@JohnWoo 的答案以了解如何操作。
【解决方案4】:

您可以使用简单查询作为

select * from tableA,tableB where tableA.Name Not In tableB.Name And tableB.Name Not In tableA.Name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多