我有一个SQL问题,我正在努力解决这个问题。请考虑这两个表格中的数据:
公司:
| id | name |
| 1 |Fake Company|
company_addresses:
| 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
列为true表示主地址。但是,数据有点搞砸了,有些地址只叫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
但显然只会带回标有主要地址的公司,而不是使用我想要的优先级列表。
答案 0 :(得分: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'))
答案 1 :(得分: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非常简单。