【发布时间】:2019-07-19 01:56:12
【问题描述】:
我在下面有两张表:
表 A
+--------+--------+--------+
| color | shape | size |
+--------+--------+--------+
| Red | Square | Small |
| Blue | Square | Small |
| Yellow | Square | Small |
| Red | Circle | Small |
| Blue | Circle | Small |
| Yellow | Circle | Small |
| Yellow | Square | Medium |
| Red | Circle | Medium |
| Blue | Circle | Medium |
| Yellow | Circle | Medium |
| Red | Square | Large |
| Red | Circle | Large |
| Blue | Circle | Large |
| Yellow | Circle | Large |
+--------+--------+--------+
表 B
+---------------+
| edge |
+---------------+
| Straight Line |
| Dotted Line |
| Squiggly Line |
+---------------+
我正在运行以下查询:
WITH TableA (color, shape, size)
AS (SELECT DISTINCT color, shape, size
FROM TableA),
TableB (edge)
AS (SELECT DISTINCT edge
FROM TableB)
SELECT COUNT(*) FROM
(SELECT a.*,
b.*
FROM TableA AS a
CROSS JOIN TableB AS b) as x;
我期望发生的事情:它将从表 A 中的每一列(颜色、形状、大小)中选择所有不同的值,然后从表 B 中的每一列(边缘)中选择每个唯一值,然后进行交叉连接产生颜色、形状、大小和边缘的每一种组合。
我已经检查了查询选择唯一值的部分是否独立工作,但同时运行它产生的行数比我预期的要少。
使用 3 种颜色、2 种形状、3 种尺寸和 3 条边,我应该得到 54 种可能的组合/行,但我只得到 42 种。
【问题讨论】:
-
您期望发生的并不是实际发生的。在 CROSS JOIN 中,第一个表中的每个 row 都连接到另一个表中的所有 rows。连接是逐行完成的,而不是逐个字段的。
-
@BobJarvis 我现在看到这就是发生的事情,因为 14 x 3 = 42。我的查询是选择颜色、形状和大小的不同组合(这是表 A 中的所有行,因为它们'都是唯一的),并与表 B 中的行交叉连接。
标签: sql postgresql-9.6 cross-join