0

有两个 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.idrawData.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    |
+----+-----------+------+-----------+
4

0 回答 0