2

既存のテーブルデータのクエリを作成しようとしています。TABLE_AとTABLE_Bには1つのレコードがありますが、TABLE_Cには2つのレコードがあります。1つは自宅の住所用で、もう1つは職場の住所用です。

したがって、次のクエリは2つのレコードを返します。2つのレコードから1つのレコードだけを取得しようとしています。

CITYがNULLの場合、address_type = 1(Home)のstate_idはnullであり、Work(address_type = 2)アドレスを取得します。両方がnullの場合は、「ホーム」アドレスを取得します。この機能を実現するための最良の方法は何ですか。

提案ありがとうございます。

select a.A_ID, a.B_ID, a.A_DESC, b.first_name, b.last_name, c.address_type,  c.city, c.state
from table_A a
left join table_B b on b.B_ID = a.B_ID
left join table_C c on c.B_id = b.B_id
where a.A_ID = 10

TABLE_A

A_ID int
B_ID int 
A_Desc  varchar(20)

TABLE_B

B_ID int
first_name  varchar(30)
last_name   varchar(30)

TABLE_C

C_ID    int
B_ID    int 
address_type    int 
city      varchar(50)
state  int

結果:

 A_ID     B_ID   A_DESC   first_name  last_name  address_type   city       state
 --------------------------------------------------------------------------------
 10       200    test_     name1        name_last    1            NULL       NULL 
 10       200    test_     name1        name_last    2           City_test    2

この最終結果が欲しい

 A_ID     B_ID   A_DESC   first_name  last_name  address_type   city       state
 --------------------------------------------------------------------------------
 10       200    test_     name1        name_last    2           City_test    2
4

4 に答える 4

0
select a.A_ID, a.B_ID, a.A_DESC, b.first_name, b.last_name,
       coalesce(c1.address_type,c2.address_type) address_type, 
       coalesce(c1.city,c2.city) city, 
       coalesce(c1.state,c2.state) state
from table_A a
left join table_B b on b.B_ID = a.B_ID
left join table_C c1 on c.B_id = b.B_id and c.Address_Type = 1
left join table_C c2 on c.B_id = b.B_id and c.Address_Type = 2

where a.A_ID = 10
于 2012-06-27T19:12:50.990 に答える
0

一般的なテクニック:

select distinct a.A_ID
, a.B_ID
, a.A_DESC
, b.first_name
, b.last_name
, coalesce(home.address_type, work.address_type)
, coalesce(home.city,work.city)
, coalesce(home.state, work.state) 
from table_A a 
left join table_B b on b.B_ID = a.B_ID 
left join table_C home on home.B_id = b.B_id and home.address_type = 1
left join table_C work on work.B_id = b.B_id and home.address_type = 2
where a.A_ID = 10 
于 2012-06-27T19:23:56.463 に答える
0

outer apply最も高いタイプのアドレスを検索するために使用できます。

select  *
from    table_A a
left join 
        table_B b 
on      b.B_ID = a.B_ID
outer apply
        (
        select  top 1 *
        from    table_C c 
        where   c.B_id = b.B_id
        order by
                case
                when c.address_type = 2 and c.city is not null then 1
                else c.address_type = 1 and c.city is not null then 2
                end
        ) c
where   a.A_ID = 10
于 2012-06-27T19:03:22.750 に答える
0

このロジックを、テーブル b と c への左結合の結合条件に組み込むだけです。

CITY が NULL の場合、address_type = 1 (Home) の state_id が null の場合、Work (address_type = 2) の住所を取得します。両方が null の場合は、「ホーム」アドレスを取得します

于 2012-06-27T19:09:03.337 に答える