【问题标题】:Cross join returning too few rows交叉连接返回的行太少
【发布时间】: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


【解决方案1】:

您需要单独选择列:

select c.olor, s.shape, sz.size, e.edge
from (select distinct color from a) c cross join
     (select distinct shape from a) s cross join
     (select distinct size from a) sz cross join
     (select distinct edge from b) e 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多