在 Postgres JOIN 查询中区分 null 和 empty

Differentiate null and empty in Postgres JOIN query

如果我有这样的表:

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

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

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;

当然还有 returns:

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) 和空结果 (id=1234132)?我想我想在没有单独查询的情况下验证我正在检查的 ID 是否存在。这可能吗?

怎么样 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语法。