我如何比较我的2个SQL表?

时间:2018-02-26 07:53:52

标签: sql compare

我有2个表,其中包含一堆供应商端口,比2个屏幕截图更多的字段,但重要字段是3,供应商编号,端口代码和端口处于活动状态。

我想以3种不同的方式比较2个表:

  1. 表1有什么,表2没有?
  2. 表2有什么,表1没有?
  3. 这两个表有什么,但它们是不同的,例如:port active = Y或表1和表2中同一端口的N.
  4. 这样比较它们的最佳方式是什么?

    Table 1

    Table 2

2 个答案:

答案 0 :(得分:0)

如果SUPPLIER_NO可被视为主键或至少是以下查询唯一,则会返回Table1Table2

中不可用的SELECT A.* FROM Table1 A LEFT JOIN Table2 B ON A.SUPPLIER_NO = B.SUPPLIER_NO WHERE B.SUPPLIER_NO IS NULL 中可用的内容
Table1

只需切换Table2Table2即可获取Table1而不是PORT_ACTIVE中的内容。

要获得表之间的差异,您可以使用集合运算符,但是您应该转换最后一个字段值,以便它在两个表中具有相同的域(例如,Table2中的'Y'应该使用{{ 1}}和'N'代替truefalse)。例如,我们可以考虑此表Table2_Converted。 然后,您可以在两个表之间执行MINUSEXCEPT(基于您正在使用的RDBMS可能会有所不同)操作。

SELECT *
FROM (SELECT T1.* FROM Table1 T1 INNER JOIN Table2_Converted T2 ON T1.SUPPLIER_NO=T2.SUPPLIER_NO)
MINUS
SELECT *
FROM (SELECT T2.* FROM Table1 T1 INNER JOIN Table2_Converted T2 ON T1.SUPPLIER_NO=T2.SUPPLIER_NO)

将返回两个表格中的所有内容,但Table1中的内容有所不同。

SELECT *
FROM (SELECT T2.* FROM Table1 T1 INNER JOIN Table2_Converted T2 ON T1.SUPPLIER_NO=T2.SUPPLIER_NO)
MINUS
SELECT *
FROM (SELECT T1.* FROM Table1 T1 INNER JOIN Table2_Converted T2 ON T1.SUPPLIER_NO=T2.SUPPLIER_NO)

只需切换两个语句,使两个表中的所有内容都可用,但在Table2中有所不同。

答案 1 :(得分:0)

添加到folco已经说过的内容,您还可以在 WHERE 子句中使用 NOT IN 运算符。

我将在下面的示例中将 SUPPLIER_NO 视为 PRIMARY KEY

SELECT *
    -> FROM Supplier
    -> WHERE Supplier_No NOT IN(
    -> SELECT Supplier_No
    -> FROM Supplier2);

这是输出

+----+-------------+-----------+--------+
|    | Supplier_No | Port_Code | Active |
+----+-------------+-----------+--------+
|  6 |         996 | CAN       | Y      |
|  7 |         996 | HKG       | Y      |
|  8 |         996 | SHA       | Y      |
|  9 |         996 | SHK       | Y      |
| 10 |         996 | TAO       | Y      |
| 11 |         996 | XMN       | Y      |
+----+-------------+-----------+--------+

反之亦然,以获得您想要的其他信息:

SELECT *
    -> FROM Supplier2
    -> WHERE Supplier_No NOT IN(
    -> SELECT Supplier_No
    -> FROM Supplier);

输出:

+----+-------------+-----------+-------------+
|    | Supplier_No | Port_Code | Port_Active |
+----+-------------+-----------+-------------+
|  1 |        1384 | YTN       | false       |
|  2 |        1543 | SHA       | true        |
|  3 |        1982 | SHA       | true        |
|  4 |        1662 | SHA       | true        |
|  5 |        1384 | SHA       | true        |
|  6 |        1543 | TAO       | true        |
|  8 |        1982 | TAO       | true        |
|  9 |        1662 | TAO       | true        |
| 10 |        1678 | SWA       | true        |
| 12 |        1991 | SWA       | true        |
| 13 |        1543 | XMN       | true        |
| 14 |        1982 | XMN       | true        |
| 15 |        1991 | CWN       | false       |
+----+-------------+-----------+-------------+