1

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

样品表:

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
4

4 回答 4

3

由于 MySQL 缺乏FULL JOIN,您仍然可以使用LEFT or RIGHTjoin with来模拟它UNION。尝试,

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 演示

于 2012-09-21T01:25:13.120 回答
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)
于 2012-09-21T01:36:20.140 回答
0
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")

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

于 2012-09-21T01:56:08.997 回答
0

您可以使用简单查询作为

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

于 2012-09-21T04:16:58.900 回答