2013-09-26 2 views
1

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 

내가 그들의 주요 주소와 함께 회사를 검색 할 수 있습니다. 주 주소는 열이 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 

하지만 분명히 내가 원하는 우선 순위 목록을 사용하는 대신 주 주소로 표시된 회사 만 다시 불러올뿐입니다.

+0

어떤 데이터베이스 서버를 사용하고 있습니까? 그건 중요 하거든. – penguat

+0

저는 Postgres를 사용하고 있습니다. –

+0

이렇게 태그를 지정하면 postgres 태그를 따르는 사람이 태그를 추가 할 가능성이 높아지고 더 나은 답변을 얻을 수 있습니다. – penguat

답변

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')) 
+0

신난다, 고마워. 기업 주소가 표시되고 주요 주소가 지정되었지만 회사 주소가 없으면 어떻게됩니까? –

+0

조건을 다른 'OR'에 추가하십시오. 주소를 찾지 못하면 반환 할 내용을 이해하지 못했습니다. –

+0

주소가없는 경우 아무 것도 반환하고 싶지 않습니다. 나는 이것을 다음과 같이 풀 었다고 생각한다. (ca.main is TRUE) OR (ca.main is FALSE and ca.name = \ 'MAIN \') OR (ca.main is NULL)' –

0

나는 포스트 그레스를 모른다 - 그러나 이것은 일반적인 개요로 유용 할 수 있습니다 :

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을 사용하여, 합리적으로 간단합니다 .