2016-08-25 23 views
1

我試圖查詢我的數據庫以返回與輸入的郵政編碼匹配的所有建築物。我的客戶給我提供了相關主題的兩個表:如何選擇其中一個字段在多個字段中的行

   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%' 

注:用於Distinct避免Building表重複的記錄,因爲你原來的不重複的結果。如果您postal_codes表沒有在pc.primarypc.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

我嘗試了你發佈的第一個代碼,它沒有工作。我找回了整個數據庫(或者至少看起來像我做過的,可能有很多重複的行)。但是,您發佈的第二個查詢完美工作(如果客戶想要爲每個郵政編碼創建第三個建築,則更新起來非常簡單)。 – 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_它回答了這個問題。提供這種附加背景將顯着提高其長期教育價值。請[編輯]您的答案以添加解釋,包括適用的限制和假設。 –

相關問題