繁体   English   中英

将两个JOIN查询组合在一起

[英]Combining two JOIN queries together

我有3个表Appliance,Tx_property,Rx_property

#Appliance Table structure:
  -id
  -tx_property_id
  -rx_property_id
  -...

#Tx_property Table structure:
  -id
  -...

#Rx_property Table structure:
  -id
  -...

在rx_property.id = Appliance.id和tx_property.id = Appliance.id上设置约束

是否可以仅运行一个查询以从Appliance表中检索具有相应条目的所有记录(基于rx_property_id和tx_property_id)?

总而言之,我想将以下两个查询合并为一个。

select * from appliance INNER JOIN rx_property ON rx_property.id= appliance.rx_property_id;
select * from appliance INNER JOIN tx_property.id ON tx_property.id= appliance.tx_property_id;

有任何想法吗? 谢谢!

编辑:

因此,如果我有以下示例记录:

appliance records:
id = 70
tx_property_id = 11
rx_property_id = null

id = 71
tx_property_id = 12
rx_property_id = null

id = 72
tx_property_id = null
rx_property_id = 11

id = 73
tx_property_id = null
rx_property_id = 12

tx_property records:
id = 11
name = 'tx_aa'

id = 12
name = 'tx_bb'

rx_property records:
id = 11
name = 'rx_aa'

id = 12
name = 'rx_bb'

我希望其中4个被检索为:

appliance.id = 70
appliance.tx_property_id = 11
appliance.rx_property_id = null
tx_property.id = 11
tx_property.name = 'tx_aa'

appliance.id = 71
appliance.tx_property_id = 12
appliance.rx_property_id = null
tx_property.id = 12
tx_property.name = 'tx_bb'

appliance.id = 72
appliance.tx_property_id = null
appliance.rx_property_id = 11
tx_property.id = 11
tx_property.name = 'rx_aa'

appliance.id = 73
appliance.tx_property_id = null
appliance.rx_property_id = 12
tx_property.id = 11
tx_property.name = 'rx_aa'

就这么简单:

select * from appliance
INNER JOIN rx_property ON rx_property.id= appliance.rx_property_id
INNER JOIN tx_property ON tx_property.id= appliance.tx_property_id

您可以根据需要将多个连接放入单个SELECT语句中。

您可以在单个查询中将两个表连接到appliance

select * 
from appliance a
join rx_property r on r.id = a.rx_property_id
join tx_property t on t.id = a.tx_property_id

上面的查询仅返回引用这两个表的这些行。 如果要获取所有行,请使用left join

select * 
from appliance a
left join rx_property r on r.id = a.rx_property_id
left join tx_property t on t.id = a.tx_property_id;

 id | rx_property_id | tx_property_id | id | name  | id | name  
----+----------------+----------------+----+-------+----+-------
 70 |             11 |                | 11 | rx_aa |    | 
 71 |             12 |                | 12 | rx_bb |    | 
 72 |                |             11 |    |       | 11 | tx_aa
 73 |                |             12 |    |       | 12 | tx_bb
(4 rows)    

您可以在选择列表中使用coalesce()选择不为空的列,例如:

select 
    a.id, rx_property_id, tx_property_id,
    coalesce(r.name, t.name) as property_name
from appliance a
left join rx_property r on r.id = a.rx_property_id
left join tx_property t on t.id = a.tx_property_id

 id | rx_property_id | tx_property_id | property_name 
----+----------------+----------------+---------------
 70 |             11 |                | rx_aa
 71 |             12 |                | rx_bb
 72 |                |             11 | tx_aa
 73 |                |             12 | tx_bb
(4 rows)    

还要注意,我为表使用了别名,通常使查询更具可读性。

文档中阅读有关联接类型的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM