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 子句。