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'
)
两个问题:
- 如何重写 go get one row per JOIN on quality?
- 如果某一天缺少相应的行(关于质量),它仍然有效吗?
编辑
这是输入:
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。
我需要在 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'
)
两个问题:
- 如何重写 go get one row per JOIN on quality?
- 如果某一天缺少相应的行(关于质量),它仍然有效吗?
编辑
这是输入:
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。