2016-08-25 3 views
1

입력 한 우편 번호와 일치하는 모든 건물을 반환하도록 내 DB에 쿼리하려고합니다. 제 의뢰인이 주제와 관련된 두 개의 테이블로 날을 제공하고있다 : 불행하게도 나를 위해한 필드가 여러 필드에있는 행을 선택하는 방법

   buildings 
+----+------------+---------------+ 
| id | name | building_code | 
+----+------------+---------------+ 
| 1 | Building A |   001 | 
| 2 | Building B |   002 | 
| 3 | Building C |   003 | 
+----+------------+---------------+ 

      postal_codes 
+----+-------------+---------+-----------+ 
| id | postal_code | primary | pecondary | 
+----+-------------+---------+-----------+ 
| 1 | A1A 1A1 |  001 |  002 | 
| 2 | B2B 2B2 |  002 |  003 | 
| 3 | C3C 3C3 |  003 |  001 | 
+----+-------------+---------+-----------+ 

, 우편 번호가 포함 된 테이블은 중복의 건물 코드 (A 우편 번호는 주요 건물이 있고, 보조 건물)

을 포함

따라서 우편 번호 A1A이있는 건물을 검색 할 때 건물 A와 건물 B를 받아야합니다. 이는 그다지 문제가 아니지만 내가 찾은 유일한 방법입니다 엄청나게 부피가 크며 미래의 교정을위한 많은 옵션을 남기지 않습니다.

SELECT * FROM buildings 
WHERE (building_code IN (SELECT primary FROM postal_codes 
          WHERE postal_code LIKE '%A1A%') 
     OR 
     building_code IN (SELECT secondary FROM postal_codes 
          WHERE postal_code LIKE '%A1A%')) 

나는 단지 building IN (SELECT primary, secondary FROM postal_codes)을 시도했지만 오류가 계속 발생합니다.

답변

1

당신은 JOIN

SELECT DISTINCT b.* 
FROM buildings b 
     JOIN postal_codes pc 
     ON b.building_code IN (pc.primary, pc.secondary) 
WHERE postal_code LIKE '%A1A%' 

주를 사용할 수 있습니다는 원래이 결과를 중복하지 않기 때문에 Building 테이블에서 중복 레코드를 방지하기 위해 Distinct을 사용합니다. 당신의 postal_codes 테이블 pc.primary 또는 pc.secondary 열에서 중복 된 항목이없는 경우에는 Distinct

을 제거 할 수 있습니다 또는 당신은이 같은 테이블을 조인 시도 할 수 EXISTS

SELECT * 
FROM buildings B 
WHERE EXISTS (SELECT 1 
       FROM postal_codes PC 
       WHERE B.building_code IN (pc.primary, pc.secondary) 
         AND PC.postal_code LIKE '%A1A%') 
+0

게시 한 첫 번째 코드를 시도했지만 작동하지 않았습니다. 나는 전체 databse를 되찾았다. (적어도 내가했던 것처럼 보였고, 많은 중복 된 행이있을 수있다.) 그러나 게시 한 두 번째 쿼리는 완벽하게 작동합니다 (클라이언트가 우편 번호 당 3 차 건물을 원할 경우 매우 간단하게 업데이트 할 수 있습니다). – Chaosxmk

2

를 사용할 수 있습니다

select b.* 
    from postal_codes p 
    join buildings b 
    on b.building_code = p.primary OR b.building_code = p.secondary 
where p.postal_code LIKE '%A1A%' 
+0

예이 코드는 작동합니다 –

0
SELECT b.* 
FROM 
(
SELECT primary as b_id FROM postal_codes WHERE postal_code LIKE '%A1A%' 
UNION DISTINCT 
SELECT pecondary as b_id FROM postal_codes WHERE postal_code LIKE '%A1A%' 
) x 
inner join buildings as b on x.b_id = b.building_code 
+0

이 코드는 문제를 해결하는 데 도움이 될 수 있지만 _why_ 및/또는 _how_가 질문에 대답하는 것을 설명하지 않습니다. 이러한 추가적인 맥락을 제공하면 장기적인 교육적 가치가 크게 향상 될 것입니다. 어떤 제한 사항 및 가정이 적용되는지를 포함하여 설명을 추가하기 위해 답을 [편집하십시오]. –

관련 문제