SQL 查询连接 3 个表和 return 单行
SQL query to join 3 tables and return a single row
我有一个包含地点列表的 table - 根据 place_id 字段,每个地点都是唯一的:
place_id name
TEST01 Company1
我还有一个名为 place_address 的 table,它有一个名为 address_id 的索引字段,用于存储地址信息(注意该地点有多个地址):
place_id address_type address_id
TEST01 DEFAULT 507
TEST01 REGISTERED_OFFICE 508
地址table实际持有地址详情:
address_id name address city
507 address1 address1, road1 city1
508 address2 address2,road2 city2
我正在使用 2 个连接查询三个 table:
select pl.place_id,
pl.name,
pl.email_address,
pl.phone,
pl.fax,
pl.web_address,
pl.vat_registration,
pl.user_def2 as companyregno,
case when pa.address_type = 'DEFAULT' then ad.address else NULL end as default_address,
case when pa.address_type = 'REGISTERED_OFFICE' then ad.address else NULL end as registered_address,
ad.second_address,
ad.third_address,
ad.fourth_address,
ad.city,
ad.zippost
from place pl
left join place_address pa on pl.place_id = pa.place_id
left join address ad on pa.address_id = ad.address_id
where pl.place_id like '%TEST%'
and pa.address_type in ('DEFAULT','REGISTERED_OFFICE')
输出结果如下:
place_id name email_address phone fax web_address vat_registration companyregno default_address registered_address second_address third_address fourth_address city zippost
TEST01 Company1 NULL NULL NULL NULL 2345678 123456 address1, road1 NULL NULL NULL NULL city1 NULL
TEST01 Company1 NULL NULL NULL NULL 2345678 123456 NULL address2,road2 NULL NULL NULL city2 NULL
但是,我想要实现的是单行输出,其中默认地址和注册地址在单行输出上:
place_id name email_address phone fax web_address vat_registration companyregno default_address registered_address second_address third_address fourth_address city our_zippost
TEST01 Company1 test@test.co.uk 0123456789 0123456789 test@test.com 2345678 123456 address1,road1 address2,road2 NULL NULL NULL NULL NULL
如能提供帮助,我们将不胜感激!
像这样的东西应该适合你的情况:
SELECT a.place_id, a.name, add_for_def.address as 'DEFAULT_ADDRESS', add_for_reg.address as 'REGISTERED_OFFICE_ADDRESS'
FROM places a
INNER JOIN place_address def_add ON def_add.place_id = a.place_id AND def_add.address_type = 'DEFAULT'
INNER JOIN place_address reg_off ON reg_off.place_id = a.place_id AND reg_off.address_type = 'REGISTERED_OFFICE'
INNER JOIN address add_for_def ON add_for_def.address_id = def_add.address_id
INNER JOIN address add_for_reg ON add_for_reg.address_id = reg_off.address_id
WHERE a.place_id = 'TEST_01'
基本上,您在同一 table 上进行了两次联接,但每次联接都受 ADDRESS_TYPE
列的约束。然后你对实际的 ADDRESS
table 再做一个 JOIN
这样你就可以在同一行显示两个地址。
P.S。
- 为简洁起见,我省略了一些列。
- 您还可以根据需要添加额外的 where 子句。
我有一个包含地点列表的 table - 根据 place_id 字段,每个地点都是唯一的:
place_id name
TEST01 Company1
我还有一个名为 place_address 的 table,它有一个名为 address_id 的索引字段,用于存储地址信息(注意该地点有多个地址):
place_id address_type address_id
TEST01 DEFAULT 507
TEST01 REGISTERED_OFFICE 508
地址table实际持有地址详情:
address_id name address city
507 address1 address1, road1 city1
508 address2 address2,road2 city2
我正在使用 2 个连接查询三个 table:
select pl.place_id,
pl.name,
pl.email_address,
pl.phone,
pl.fax,
pl.web_address,
pl.vat_registration,
pl.user_def2 as companyregno,
case when pa.address_type = 'DEFAULT' then ad.address else NULL end as default_address,
case when pa.address_type = 'REGISTERED_OFFICE' then ad.address else NULL end as registered_address,
ad.second_address,
ad.third_address,
ad.fourth_address,
ad.city,
ad.zippost
from place pl
left join place_address pa on pl.place_id = pa.place_id
left join address ad on pa.address_id = ad.address_id
where pl.place_id like '%TEST%'
and pa.address_type in ('DEFAULT','REGISTERED_OFFICE')
输出结果如下:
place_id name email_address phone fax web_address vat_registration companyregno default_address registered_address second_address third_address fourth_address city zippost
TEST01 Company1 NULL NULL NULL NULL 2345678 123456 address1, road1 NULL NULL NULL NULL city1 NULL
TEST01 Company1 NULL NULL NULL NULL 2345678 123456 NULL address2,road2 NULL NULL NULL city2 NULL
但是,我想要实现的是单行输出,其中默认地址和注册地址在单行输出上:
place_id name email_address phone fax web_address vat_registration companyregno default_address registered_address second_address third_address fourth_address city our_zippost
TEST01 Company1 test@test.co.uk 0123456789 0123456789 test@test.com 2345678 123456 address1,road1 address2,road2 NULL NULL NULL NULL NULL
如能提供帮助,我们将不胜感激!
像这样的东西应该适合你的情况:
SELECT a.place_id, a.name, add_for_def.address as 'DEFAULT_ADDRESS', add_for_reg.address as 'REGISTERED_OFFICE_ADDRESS'
FROM places a
INNER JOIN place_address def_add ON def_add.place_id = a.place_id AND def_add.address_type = 'DEFAULT'
INNER JOIN place_address reg_off ON reg_off.place_id = a.place_id AND reg_off.address_type = 'REGISTERED_OFFICE'
INNER JOIN address add_for_def ON add_for_def.address_id = def_add.address_id
INNER JOIN address add_for_reg ON add_for_reg.address_id = reg_off.address_id
WHERE a.place_id = 'TEST_01'
基本上,您在同一 table 上进行了两次联接,但每次联接都受 ADDRESS_TYPE
列的约束。然后你对实际的 ADDRESS
table 再做一个 JOIN
这样你就可以在同一行显示两个地址。
P.S。
- 为简洁起见,我省略了一些列。
- 您还可以根据需要添加额外的 where 子句。