我有2个表,其中包含一堆供应商端口,比2个屏幕截图更多的字段,但重要字段是3,供应商编号,端口代码和端口处于活动状态。
我想以3种不同的方式比较2个表:
这样比较它们的最佳方式是什么?
答案 0 :(得分:0)
如果SUPPLIER_NO
可被视为主键或至少是以下查询唯一,则会返回Table1
中Table2
SELECT A.*
FROM Table1 A
LEFT JOIN Table2 B
ON A.SUPPLIER_NO = B.SUPPLIER_NO
WHERE B.SUPPLIER_NO IS NULL
中可用的内容
Table1
只需切换Table2
和Table2
即可获取Table1
而不是PORT_ACTIVE
中的内容。
要获得表之间的差异,您可以使用集合运算符,但是您应该转换最后一个字段值,以便它在两个表中具有相同的域(例如,Table2
中的'Y'
应该使用{{ 1}}和'N'
代替true
和false
)。例如,我们可以考虑此表Table2_Converted
。
然后,您可以在两个表之间执行MINUS
或EXCEPT
(基于您正在使用的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 |
+----+-------------+-----------+-------------+