我不知道如何问这也是一个例子。 说我有2张桌子: 网页:
idpage title
0 first
1 second
2 third
读取:
idread idpage time
50 0 8:15
83 0 2:58
如果我SELECT * FROM pages,reads WHERE pages.idpage=reads.idpage AND pages.idpage<2
我会有类似的东西:
idpage title idread time
0 first 50 8:15
0 first 83 2:58
我想要的地方:
idpage title idread time
0 first 50 8:15
0 first 83 2:58
1 second 0 0:00
由于
答案 0 :(得分:2)
始终使用显式JOIN
语法。 从不在FROM
子句中使用逗号。
您需要的是LEFT JOIN
。并且,您表达查询的方式使得更难以弄清楚。所以:
SELECT p.idpage, p.title,
COALESCE(idread, 0) as idread,
COALESCE(time, cast('0:00' as time)) as time
FROM pages p LEFT JOIN
reads r
ON p.idpage = r.idpage
WHERE p.idpage < 2;
请注意,使用LEFT JOIN
时, first 表中的条件应包含在WHERE
子句中。 second 表中的条件位于ON
子句中。
答案 1 :(得分:2)
当它们为null时,您需要左连接和CASE表达式来完成值,如下所示:
SELECT p.*,
case when r.idread is null then 0 else r.idread end as idread
case when r.time is null then '0:00' else r.time end as time
FROM pages p
LEFT OUTER JOIN reads r
ON(p.idpage = r.idpage)
WHERE p.idpage < 2
请注意,我已将您的语法更改为显式连接语法(LEFT OUTER JOIN),而不是您的隐式语法,这很容易导致问题,尤其是在离开加入时。
答案 2 :(得分:1)
使用全外连接
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;