1

我有一个 SQL 问题,我正在努力解决这个问题。考虑这两个包含这些数据的表:

公司:

|    id    |    name    |
|     1    |Fake Company|

公司地址:

|   id    |    company_id    |    name    |    address1    |    address2    |    town    |    postcode    |    main
|   1     |         1        | Head Office|   Building 2   |   RandStreet   |   London   |    L1 2FN      |     t
|   2     |         1        |    MAIN    |   Building 14  |   RandRoad     |   London   |    L1 6RR      |     f

我想检索一家公司及其主要地址。主地址由表main中为真的列指示company_addresses。但是,数据有些混乱,只是调用了一些地址MAIN。有些公司根本没有任何地址!

那么,我如何检索一家公司及其地址,首先选择标记为的地址MAIN,然后如果该地址不存在,则获取所调用的地址,MAIN如果该地址不存在,则不返回任何内容?我现在只有:

SELECT * FROM companies c
JOIN company_addresses ca ON ca.company_id = c.id
WHERE c.name = 'Fake Company'
AND ca.main IS TRUE

但显然这只会带回将地址标记为主要地址的公司,而不是使用我想要的优先级列表。

4

2 回答 2

0

我不知道 Postgres - 但这可能有助于概括:

SELECT * FROM companies c
JOIN company_addresses ca ON ca.company_id = c.id
WHERE c.name = 'Fake Company'
AND (ca.id IS NULL OR ca.id IN (SELECT TOP 1 id FROM company_addresses WHERE company_id = c.id ORDER BY main DESC, CASE WHERE name = MAIN 1 ELSE 0 END DESC))

这可能不是最快的解决方案,但它相当简单,使用相关子查询和 TOP。

于 2013-09-26T09:18:25.807 回答
0
SELECT * FROM companies c
JOIN company_addresses ca ON ca.company_id = c.id
WHERE c.name = 'Fake Company'
AND ((ca.main IS TRUE) OR (ca.main IS FALSE AND ca.name = 'MAIN'))
于 2013-09-26T09:13:25.137 回答