1

頭を悩ませているSQLの問題があります。次のデータを含む次の 2 つのテーブルを検討してください。

企業:

|    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、表の列が true であることによって示され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 に答える