2016-08-25 12 views
1

入力した郵便番号と一致するすべての建物を返すようDBを照会しようとしています。私のクライアントは、被験者に関連する2つのテーブルを提供してくれました。残念ながら私にとって複数のフィールドに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 | 
+----+-------------+---------+-----------+ 

、郵便番号を含むテーブルは、重複の建築コード(郵便番号が主要な建物があり、二ビル)

が含まれています

したがって、郵便番号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全体を取り戻しました(少なくとも、私がやったように見えました、重複した行がたくさんあるかもしれません)。しかし、投稿した2番目のクエリは完全に機能しました(クライアントが郵便番号ごとに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_が質問に答えているとは説明しません。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

関連する問題