有两个 postgres 表,其结构大致如下:
products
+----+-----------+
| id | rawDataId |
+----+-----------+
| 1 | a |
+----+-----------+
| 2 | null |
+----+-----------+
| 3 | b |
+----+-----------+
| 4 | null |
+----+-----------+
| 5 | c |
+----+-----------+
rawData
+----+-----------+
| id | productId |
+----+-----------+
| a | 1 |
+----+-----------+
| b | 3 |
+----+-----------+
| c | 5 |
+----+-----------+
| d | 6 |
+----+-----------+
| e | 7 |
+----+-----------+
| f | 8 |
+----+-----------+
| g | 9 |
+----+-----------+
虽然在设置 FK 约束时没有正确定义这些约束,但在应用程序逻辑中products.rawDataId
映射到rawData.id
并rawData.productId
映射到products.id
. 中的每条记录products
可以有 1 条或 0 条记录rawData
,同时也有一些孤立记录,rawData
其关联products
记录已被删除。
我正在尝试rawData
通过左连接来查找所有孤立的记录。但是,根据我的连接条件,我得到不同的行数:
psql> SELECT count(*)
FROM "rawData" "r"
LEFT JOIN "products" "p"
ON "r"."productId" = "p"."id"
WHERE "p"."id" IS NULL;
psql> 7000
psql> SELECT count(*)
FROM "rawData" "r"
LEFT JOIN "products" "p"
ON "r"."id" = "p"."rawDataId"
WHERE "p"."id" IS NULL;
psql> 9239
这些表有大约 100k 行,因此手动遍历它们并不容易,但我想知道在什么情况下我会根据连接条件得到不同的结果。他们不应该返回相同数量的行吗?
考虑到这些表结构和约束,我是否可以执行任何其他查询来查找差异,或者更准确地获取孤立行的数量?
根据示例表,我想得到的输出是:
+----+-----------+------+-----------+
| id | productId | id | rawDataId |
+----+-----------+------+-----------+
| d | 6 | null | null |
+----+-----------+------+-----------+
| e | 7 | null | null |
+----+-----------+------+-----------+
| f | 8 | null | null |
+----+-----------+------+-----------+
| g | 9 | null | null |
+----+-----------+------+-----------+