Sql 在Postgres联接查询中区分null和empty
如果我有这样的表格:Sql 在Postgres联接查询中区分null和empty,sql,database,postgresql,join,postgresql-9.4,Sql,Database,Postgresql,Join,Postgresql 9.4,如果我有这样的表格: 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
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)
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=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=4;
id | name | value
----+------+-------
(0 rows)
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是否存在,而不需要单独的查询。这可能吗?左连接怎么样
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
子句中使用逗号。始终,始终使用正确、明确的连接
语法。使用左连接如何
:
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
子句中使用逗号。始终,始终使用正确的显式连接
语法。您是否尝试了表t1的外部连接
?它将返回t1中的所有记录您是否尝试了表t1的外部联接
?它将返回t1中的所有记录您的意思是选择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其中t1.id=1代码>(第二个左连接)。另外,你是否建议不要像我在原来的问题中那样通过WHERE
子句执行JOIN
。FROM
子句中的逗号已经过时20多年了。我从
注释中理解了,谢谢。我问的是正确的显式JOIN
部分。你的意思是从t1左JOIN中选择t1.id,t1.name,t2.value在t1.id=t\u JOIN.t1\u id在t2.id=t\u JOIN.t2\u id,其中t1.id=1代码>(第二个左连接)。另外,你是否建议不要像我在原来的问题中那样通过WHERE
子句执行JOIN
。FROM
子句中的逗号已经过时20多年了。我从
注释中理解了,谢谢。我问的是正确的显式JOIN
部分。