2016-03-22 9 views
1

2つのテーブルを組み合わせる必要があります。このmySQLクエリをどのように攻撃できますか?

最初のテーブルはPeople(SSN PRIMARY KEY、fname、lname)です。

他のテーブルはCities(name、cityID)です。ここでname = "fname lname"、つまりPeopleの2列が間にスペースを入れて連結されています。 1人に複数の都市が関連付けられていて、都市には複数の人がいる場合があります(多数 - 多く)。

2つをテーブルPeopleCities(SSN、cityID)に結合します。ある都市で人が見つからない場合は、そのcityIDのSSNを0にする必要があります。私の経験は主にMySQLよりもsqliteを使用しているため、私は自分のクエリには自信がありません。ここで

は私のクエリです:

SELECT ISNULL(People.SSN, 0), Cities.cityID 
FROM People 
FULL OUTER JOIN Cities 
ON (Cities.name = CONCAT_WS(" ", People.fname, " ", People.lname) FROM People); 
+1

あなたが本当にする必要がデータを再構築します。正しい[データベース正規化](http://ja.wikipedia.org/wiki/Zero_one_infinity_rule) [http://en.wikipedia.org/wiki/Database_normalization]の[ゼロ、1または無限大ルール](http://en.wikipedia.org/wiki/Zero_one_infinity_rule)を試してください。またはクエリを書くことははるかに難しくなります。名前の代わりにIDフィールドで参照できないのはなぜですか? [人々は名前を変えます](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)、データベースはすぐに同期しなくなります。 – tadman

+0

市のテーブルに 'name'カラムがあると、人が見つからないのは奇妙に思えます。 –

答えて

1

あなたはUNION ALLを使用することができ、非マッチを取得するために、次に一致し、人々/都市のペアを取得する最初:

select p.ssn, coalesce(c.cityid, 0) 
from people p left join 
    cities c 
    on c.name = concat_ws(' ', p.name, p.lname) 
union all 
select distinct 0, c.cityid 
from cities c 
where not exists (select 1 from people p where c.name = concat_ws(' ', p.name, p.lname); 
+0

ありがとう!私はそれを試しました、そしてそれは0にヌルを置き換えていないように見えるので、最初の行を 'p.ssn、ifnull(c.cityid、0)を選択する'に変更し、それは動作します! –

関連する問題