即使条件不为真,也要选择行

时间:2016-03-06 14:41:26

标签: sql

我不知道如何问这也是一个例子。 说我有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

由于

3 个答案:

答案 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;