SQL初心者です。
DBはSQL SERVERです。
顧客の電話番号を検索するSQLを考えています。
電話DBには、顧客で複数電話を持っている人もいます。
その人はメインに使用する番号のMAINに1をセットしてあります。
電話DB
CD K_CD NO MAIN
1 1 111-111-1111 1
2 1 111-111-1112
3 2 222-222-2221
4 2 222-222-2222 1
5 3 333-333-3333
顧客DB
K_CD NAME
1 名前A
2 名前B
3 名前C
検索結果
名前A 111-111-1111
名前B 222-222-2222
名前C 333-333-3333
よろしくお願いします。
ご自身で考えられたSQLはありますか?
どの部分が分からないか書いた方が良いと思いますよ。
丸投げっぽく感じとれます・・・
何時から、SQLのQ&Aも受け付けるようになったのかな
等と嫌味の一つも言ってみる。
電話DB、顧客DBではなくて、顧客TB、電話TBですね。
SQLServerなら INNER JOIN 等を使えば出来ますが。
関連付けによる検索ですね
例えば
SELECT BTB.NAME,ATB.NO FROM ATB INNER JOIN BTB ON
(ATB.K_CD = BTN.K_CD) WHERE BTB.NAME LIKE "######%"
ちなみに適当です。
私も真剣に考えて見ましたが、なかなか実現できませんでした。
それでみなさんの力をお借りしたいと考えました。
まずは電話DBだけで考えて見ました
電話DB
CD K_CD NO MAIN
1 1 111-111-1111 1
2 1 111-111-1112
3 2 222-222-2221
4 2 222-222-2222 1
5 3 333-333-3333
SELECT K_CD,NO,MAIN
FROM 電話DB
ORDER BY MAIN DESC
このSQLで下記のような結果です。
各K_CDの最初の1レコード目を抽出したいです。
CD K_CD NO MAIN
1 1 111-111-1111 1
2 1 111-111-1112
3 2 222-222-2222 1
4 2 222-222-2221
5 3 333-333-3333
6 3 333-333-3334
各K_CDの最初の1レコード目
1 1 111-111-1111
2 2 222-222-2222
3 3 333-333-3333
これができれば、顧客DBと結合すれば
いいと考えています。
よろしくお願いします。
WHERE で MAIN=1 としてあとはJOINしてあげれば出来ると思いますが・・・
気になったところはK_CDが3のデータに対してどちらもMAINが立っていませんが,
これは単なる書き間違えかな?
>K_CDが3のデータに対してどちらもMAINが立っていませんが
はい。
MAINに1が立っていないデータもあります。
MAINに1が立っているデータを優先にするという意味です。
複数でMAINに1が立っていないときは、どちらでもいいです。
簡単に出来るのでしょうか?
MAINに1立っていないデータはどちらでもいいというは困難でしょう。
むしろ両方出して良いなら方法はないこともないですがSQL複雑になりますよ。
MAINが1立っているデータ(①) と
MAIN に1が立っていないデータ(②) を
UNIONで連結します。
ただ②でMAINに1が立っていないデータという条件にすると①のMAIN<>1のデータも
含まれてきますので複問い合わせで省いてください。
省く方法はWHEREで
WHERE 顧客コード NOT IN (①の顧客コード)
で省いてください。
ここまでするぐらいなら最低一つはMAINに1を立てるというルールを作った方が楽とは思いますが・・・
ツイート | ![]() |