SQL 自连接不同天的数据比较

SQL Self-join with data comparison for different days

我需要在 SQL 的 两个不同的日子 比较数据 。我真的需要在单个查询中使用它,因为我需要在分页中使用结果。问题是,当我进行 self join 时,它会导致 duplicate columns 因为 INNER JOIN 是笛卡尔积。

Here's the code 在 sql fiddle

例如

SELECT * FROM `my_table` as t1 
INNER JOIN my_table t2 ON t1.quality = t2.quality
WHERE (
  t1.day = '2015-01-08' OR t1.day = '2015-01-09' OR 
  t2.day = '2015-01-08' OR t2.day = '2015-01-09'
)

两个问题:

  1. 如何重写 go get one row per JOIN on quality?
  2. 如果某一天缺少相应的行(关于质量),它仍然有效吗?

编辑

这是输入:

INSERT INTO my_table
(quality, quantity, day)
VALUES
('A', 1, '2015-01-15'),
('B', 2, '2015-01-15'),
('B', 0, '2015-01-10');

所需的输出是:

QUALITY  | QUANTITY  | T1.QUANTITY - T2.QUANTITY
A           1          0 (or NULL?)
B           2          2

解释:

每个日期都有 唯一 个值。所以我们只看到 A 和 B 质量。对于 B- 在另一个日期有合适的 B。对于 A - 没有。因此 B 的差异为 2(较高日期减去较低日期)。 A 的差值是 0,因为没有什么可以减去的。

您得到了重复的列,因为您正在从 T1 和 T2 进行查询。因此,除非您明确说只显示 T1。* 否则它将从两个 table 别名引用中获取列。

由于您的查询是在日期上执行 OR,您可能也会得到笛卡尔结果。

现在了解了您的 table 结构,但您最好使用类似...

的显式查询
SELECT
      t1.day,
      t2.day as OtherDay,
      t1.quality,
      t1.anotherColumn,
      t2.OtherAnotherColumn,
      t1.thirdColumn,
      t2.OtherThirdColumn
   FROM 
      my_table t1
         join my_table t2
            on t1.quality = t2.quality
           AND t2.day = '2015-01-09'
   where
      t1.day = '2015-01-08' 

根据(日期、质量)在您的 "my_table" 上建立索引以优化查询。您可以继续成对添加要在第 1 天和第 2 天之间比较的列。 T1 只会 return 那些与第一天相关联的人,而 T2 别名只会显示第二个日期的匹配条目。

现在,如果 T1 端只有条目,而没有相应的 T2 条目用于相关质量和日期,但您仍想查看这些条目,则只需将 JOIN 更改为 LEFT JOIN。