我有两个表,其中有一堆供应商端口,比两个屏幕截图中的字段多一些,但重要的字段是这里的3、供应商no、端口代码和端口活动。
我想用3种不同的方式比较这两张表:
像这样比较他们最好的方法是什么?


发布于 2018-02-26 09:18:26
如果SUPPLIER_NO可以被认为是主键,或者至少是唯一的,那么下面的查询将返回Table2中不可用的Table1中可用的内容
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中可用的内容。
要获得表之间的差异,可以使用set运算符,但您应该转换最后一个字段值,使其在两个表中都具有相同的域(例如,PORT_ACTIVE在Table2中的值应该使用'Y'和'N',而不是true和false)。例如,我们可以考虑这个表Table2_Converted。然后,您可以在两个表之间执行一个MINUS或EXCEPT操作(根据您正在使用的关系数据库管理系统可以是不同的)。
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中是不同的。
发布于 2018-02-26 10:32:19
除了https://stackoverflow.com/users/9405427/folco已经说过的内容之外,还可以在WHERE子句中使用NOT IN运算符。
在下面的示例中,我将考虑SUPPLIER_NO作为主键:
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 |
+----+-------------+-----------+-------------+https://stackoverflow.com/questions/48983760
复制相似问题