2017-03-27 15 views
0

如果我有这样的表:区分空和Postgres的空连接查询

t1: 
id | name 
----+------ 
    1 | a 
    2 | b 
    3 | c 
    4 | d 

t2: 
id | value 
----+------- 
10 | xxx 
20 | yyy 
30 | zzz 

t_join: 
t1_id | t2_id 
-------+------- 
    1 | 10 
    2 | 20 
    3 | 30 

为t1.id = 1 SELECT查询看起来像:

SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1; 

当然回报和:

id | name | value 
----+------+------- 
    1 | a | xxx 

如果我用id=4做同样的事情,我什么也得不到。

SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=4; 
id | name | value 
----+------+------- 
(0 rows) 

而且,如果我做同样的事情用废话id=1234132,我还什么都没得到。

SELECT t1.id, t1.name, t2.value FROM t1, t2,t_join WHERE t1.id=t_join.t1_id AND t2.id=t_join.t2_id AND t1.id=1234132; 
id | name | value 
----+------+------- 
(0 rows) 

有没有一种方法可以让我有一个空的结果(id=4)VS东西是空(id=1234132)区分?我想我想验证我检查的ID是否存在,没有单独的查询。这可能吗?

+0

你是否尝试过使用表t1的'OUTER JOIN'?这将返回t1中的所有记录 – Pons

回答

2

怎么样left join

SELECT t1.id, t1.name, t2.value 
FROM t1 LEFT JOIN 
    t_join 
    ON t1.id = t_join.t1_id LEFT JOIN 
    t2 
    ON t2.id = t_join.t2_id 
WHERE t1.id = 1; 

如果t.id没有发现,你会得到任何行。如果t2中没有匹配项,则会得到NULL值。

另外,一个简单的规则:从不FROM子句中使用逗号。 总是,总是使用正确的,明确的JOIN语法。

+0

您是否指'SELECT t1.id,t1.name,t2.value FROM t1 LEFT JOIN t_join ON t1.id = t_join.t1_id LEFT JOIN t2 ON t2.id = t_join.t2_id WHERE t1.id = 1;'(第二个左连接)。 另外,你是否建议永远不要像我在原始问题中那样通过'WHERE'子句执行'JOIN'? – Newtang

+0

@Newtang。 。 。 “FROM”条款中的逗号已过时20多年。 –

+0

我明白'FROM'的评论,谢谢。我问的是明确的'JOIN'部分。 – Newtang