【问题标题】:SQL query to join 3 tables and return a single row用于连接 3 个表并返回单行的 SQL 查询
【发布时间】:2019-12-04 14:40:43
【问题描述】:

我有一张包含地点列表的表格 - 根据 place_id 字段,每个地点都是唯一的:

place_id    name
TEST01  Company1

我还有一个名为 place_address 的表,其中有一个名为 address_id 的索引字段,然后用于存储地址信息(注意该地点有多个地址):

place_id    address_type        address_id
TEST01      DEFAULT             507
TEST01      REGISTERED_OFFICE   508

地址表实际上保存了地址详细信息:

address_id  name         address             city

507         address1    address1, road1      city1
508         address2    address2,road2       city2

我正在使用 2 个连接查询三个表:

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

任何帮助将不胜感激!

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 轻松帮您,简化问题!删除大量不需要重现问题的列。看看minimal reproducible example
  • LEFT JOIN 两次以获得同一行中的两个地址,一次用于 DEFAULT,一次用于 REGISTERED_OFFICE。
  • 我使用的是 MS SQL Server 2019
  • @jarlh - 你能更详细地解释一下吗 - 因为我已经在 select 语句中有几个连接......非常感谢

标签: sql string-aggregation


【解决方案1】:

这样的事情应该适用于你的情况:

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'

基本上,您在同一个表上执行了两次连接,但每个连接都受ADDRESS_TYPE 列的约束。然后在实际的ADDRESS 表中创建另一个JOIN,这样您就可以在同一行中显示两个地址。

附:

  • 为简洁起见,我省略了一些列。
  • 您还可以根据需要添加额外的 where 子句。

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2015-06-09
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多