SQL検索を実現するには?


ひろみ  2007-09-13 10:27:16  No: 27741

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

よろしくお願いします。


Ru  2007-09-13 17:33:10  No: 27742

ご自身で考えられたSQLはありますか?
どの部分が分からないか書いた方が良いと思いますよ。
丸投げっぽく感じとれます・・・


Syake  2007-09-13 22:49:51  No: 27743

何時から、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 "######%" 
ちなみに適当です。


ひろみ  2007-09-14 07:35:49  No: 27744

私も真剣に考えて見ましたが、なかなか実現できませんでした。
それでみなさんの力をお借りしたいと考えました。

まずは電話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と結合すれば
いいと考えています。

よろしくお願いします。


Ru  2007-09-14 17:15:27  No: 27745

WHERE で  MAIN=1  としてあとはJOINしてあげれば出来ると思いますが・・・
気になったところはK_CDが3のデータに対してどちらもMAINが立っていませんが,
これは単なる書き間違えかな?


ひろみ  2007-09-14 17:30:23  No: 27746

>K_CDが3のデータに対してどちらもMAINが立っていませんが

はい。
MAINに1が立っていないデータもあります。
MAINに1が立っているデータを優先にするという意味です。
複数でMAINに1が立っていないときは、どちらでもいいです。

簡単に出来るのでしょうか?


Ru  2007-09-14 18:06:57  No: 27747

MAINに1立っていないデータはどちらでもいいというは困難でしょう。
むしろ両方出して良いなら方法はないこともないですがSQL複雑になりますよ。

MAINが1立っているデータ(①)  と  
MAIN  に1が立っていないデータ(②)  を
UNIONで連結します。

ただ②でMAINに1が立っていないデータという条件にすると①のMAIN<>1のデータも
含まれてきますので複問い合わせで省いてください。
省く方法はWHEREで

WHERE 顧客コード NOT IN (①の顧客コード)

で省いてください。

ここまでするぐらいなら最低一つはMAINに1を立てるというルールを作った方が楽とは思いますが・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加