2016-09-02 9 views
3

クライアントテーブルには、このように動作する特殊な行がいくつかあります。同じ顧客に属しているがわずかに異なる列の値を持つ複数の顧客レコードがあります。テーブルはそれらに属し、私はテーブルの中で何も変えることができないので、これに対処するためにスクリプトを作成しなければなりません。最初の一致に行がない場合の条件付き結合、2番目の一致を使用する

今私はメインテーブルの顧客データを比較し、クライアントテーブルからデータを取得する必要があります。条件は以下の通りです:

  1. メインテーブルIdは、クライアントテーブルに存在する場合は、メインテーブルIDがクライアントテーブルに存在しない場合は、メインテーブルId列

  2. でレコードのみマッチングを取得し、使用メインテーブルIdnumberを使用して、クライアントテーブルのIdnumberを検索して一致させます。以下は

私が達成しようとしているものの例である:

はのは、このデータは、メインテーブルと下のクライアントテーブルに存在するとしましょう:シナリオで

enter image description here

を私のスクリプトは、常にクライアントテーブルPKId 1を選択し、メインテーブルId列とクライアントテーブルClientId列を照合することによって、クライアントテーブルの行PKId 2を無視する必要があります。

そして、下記の別のシナリオについて:

enter image description here

行は1が空ClientIdのを持っており、クライアントテーブルにクライアントID 10を一致させる方法はありません、私のスクリプトを検索するためには、メインテーブルIdnumberを使用する必要がありますPKIDので、クライアントテーブルのレコードを一致させ、Idnumber列でPKId 2行を取得します。

私は結合条件で大文字と小文字を区別したいと思っていましたが、どうすれば構いませんか。私は以下のようなもの(実際のないSQL文の、ちょうどいくつかのアイデア)を考えている:これを達成するために、任意の代替に私にアドバイスできるかどう

Select 
    c.Id, c.Name, c.AuthorizeToken 
From 
    Client c 
Left Join 
    Main m on (If m.Id = c.ClientId has data return, get AuthorizeToken from that row only; 
else if m.Id = c.ClientId has no data return, use m.Idnumber = c.Idnumber  
to find and get AuthorizeToken) 

は感謝しています。

+0

をJOINを使用することができますが、 'PKId'または' ClientId'が必要なのでしょうか? 'Id'は存在しません。 'm.Name'は重要ですか? – Andrew

答えて

2

あなたはまた、LEFTが代わりにクエリで

SELECT m.id, ISNULL(c.authorize_token, c1.authorize_token) authorize_token 
FROM main m 
LEFT JOIN client c ON m.id = c.client_id 
LEFT JOIN client c1 ON m.idnumber = c1.idnumber 
+0

この解決方法は間違っています。要件とサンプルデータを参照してください。クエリは1ではなく2行を返します。 – Anton

+0

クエリを編集しましたが、最後にエイリアスCと結合する前にテストしていますが、C1でなければなりません。試してみてください – Susang

+0

最初のデータサンプルでは、​​最初の結合として2つの行が返され、2番目の結合で異なる行に一致します。 – Anton

0
select 
    case when c1.PkID is not null then c1.ID else c2.ID end as ID, 
    case when c1.PkID is not null then c1.Name else c2.Name end as Name, 
    case when c1.PkID is not null then c1.AuthorizeToken else c2.AuthorizeToken end as AuthorizeToken 

from Main m 
    left join Client c1 on c1.ClientID = m.ID 
    left join Client c2 on c2.IDNumber = m.IDNumber and c1.ClientID us null 
+0

2番目のケースでは参加しません。 'c.ClientID'はnullではありません。 – Andrew

+0

Andrew、そうです。更新版はどうですか? – Anton

+0

これはうまくいきますが、selectの内容は重要な答えです。 – Andrew

0
SELECT m.id, c.name, c.authorize_token 
FROM main m, client c 
WHERE m.id = c.client_id 

UNION ALL 

SELECT m.id, c.name, c.authorize_token 
FROM main m, client c 
WHERE m.idnumber = c.idnumber 
and NOT EXISTS ( 
    SELECT c2.client_id from client c2 
    WHERE m.id = c2.client_id) 
関連する問題