Sql 带NULL的外部联接
我使用的是Postgresql,有两个表,如下所示:Sql 带NULL的外部联接,sql,postgresql,join,Sql,Postgresql,Join,我使用的是Postgresql,有两个表,如下所示: Nodes Node_Properties ----- --------------- id id attr1 name attr2 value 节点属性表中的数据如下所示: id name value ---- ---- ----- 1465 car 2 146
Nodes Node_Properties
----- ---------------
id id
attr1 name
attr2 value
节点属性表中的数据如下所示:
id name value
---- ---- -----
1465 car 2
1465 boat 1
如果没有与id关联的bike属性,我希望返回空白
select p.value, n* from nodes n
RIGHT OUTER JOIN node_properties p on n.id=p.id
where p.name = 'bike';
不返回任何内容
select p.value, n* from nodes n
RIGHT OUTER JOIN node_properties p on n.id=p.id;
返回
2 1465 attr1 attr2
1 1465 attr1 attr2
我期待着结果:
- 1465 attr1 attr2
where '-' == empty
我想你需要一个
左连接
:
select n.*, p.value
from nodes n left join
node_properties np
on n.id = np.id and p.name = 'bike';
我认为您对外部联接/组合的实际作用有误解。外部联接(左或右)返回一侧的数据,即使另一侧的数据不存在。您在数据中所做的任何操作都不会出现在结果集中。如果你需要一个事实上并不存在的特殊产品,你需要引入它。我想不出它背后有什么目的。你可以得到你想要的,如下所示:
with np (id, name, value) as
(select id, name, value
from node_properties
union
-- bike must appear in the output so generate a row if it doesn't exist.
select null, 'bike', null
where not exists
(select null
from node_properties
where name = 'bike'
)
)
select n.id node_id
, n.name node_name
, np.name properties_name
, np.value properties_value
from np
left join nodes n on np.id = n.id
order by n.id nulls first;
您是否在
node\u properties
中有名称为bike
的记录?你确定吗?不确定。如果节点_属性的“bike”记录不存在,我想在第一列中返回一个空值。它怎么知道从节点表中为不存在的bike条目获取1465 n.id?n.id 1465没有与bike对应的记录,其他id将定义bike属性。请通过编辑而不是评论进行澄清。请解释你为什么期待你所期待的,或者我们无法解决你的误解。请在代码问题中给出一个——包括剪切、粘贴、可运行代码和最小代表性示例输入代码。对于包含DDL(包括约束和索引)和以代码格式作为表输入的SQL。这仅在bike的记录存在时对我有效。当记录不存在时,它不会返回记录。@GeorgeHernando。这将返回节点中的每一行。“这不是你想要的吗?”乔治·埃尔南多·戈登的回答在我看来是对的。如果这不是您想要的,请单击并解释原因,以及您的确切要求。请参阅@Belayer的解决方案。这正是我想要的。不幸的是,像这里这样对外部连接的模糊、零碎的描述导致人们不理解它们。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。(见我对这个问题的评论)谢谢。正是我要找的。