我有两张桌子正在加入。
表1:T1
|id|date|hits|
--- ----- ------
A1 01 2
A1 02 2
A2 02 3
表2:T2
|id|date|runs|
--- ----- ------
A1 01 1
A2 02 0
A3 02 2
输出:
|id|date|hits|runs|
--- ----- --- ---
A1 01 2 1
A1 02 2 0
A2 02 3 0
每个ID都有多个日期,每个日期有不同的匹配/运行。
我试过了:
SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON (t1.id=t2.id) AND (t1.date=t2.date);
这给了我一张巨大的表格。行的方式多于T1。
T2中的行数多于T1,但我只关心T1中的日期,因此LEFT JOIN。
答案 0 :(得分:0)
如果没有看到数据样本以及您希望输出的内容,您很难理解您要做的事情,但我猜你不会这样做正确理解LEFT JOIN
的作用。
T1 LEFT JOIN T2
不将行数限制为每行T1一行。
如果T2中有多个行与T1中的给定行匹配,则连接的结果将包括T2的所有匹配行。
即使T2中的没有行匹配,T1 LEFT JOIN T2
从T1输出给定行也是如此。
我猜你可能想要这样的东西:从T1输出每一行,加入T2的最新匹配行。如果是这样,Stack Overflow上已经发布了许多解决方案。查找标记为greatest-n-per-group的问题。
重新评论:
谢谢,我用您提供的测试数据测试了您的查询。它没有给出您显示的结果。结果是:
SELECT t1.*,t2.*
FROM Table1 t1
LEFT JOIN Table2 t2 ON (t1.id=t2.id) AND (t1.date=t2.date)
ORDER BY t1.id, t1.date;
+------+------+------+------+------+------+
| id | date | hits | id | date | runs |
+------+------+------+------+------+------+
| A1 | 01 | 2 | A1 | 01 | 1 |
| A1 | 02 | 2 | NULL | NULL | NULL |
| A2 | 02 | 3 | A2 | 02 | 0 |
+------+------+------+------+------+------+
演示:http://sqlfiddle.com/#!9/cece2/2
我认为您运行的查询与您上面发布的内容不同。也许你在加入条件中混淆了AND
与OR
?