2017-05-21 24 views
0

私のプロダクションクエリには、大きなテキスト列を持つselectを使って10個の結合があります。 問題は、いくつかの検索で8mb以上のデータが返されることです。結合のために重複したデータから7mbです。上記の画像のようなものですが、はるかに大きくなります。結合時の冗長データを減らすための戦略

enter image description here

テーブル構造の私の例:

create table A (
    Id int primary key identity(1,1), 
    Value varchar(100) 
) 

create table B(
    Id int primary key identity(1,1), 
    AId int, 
    Value varchar(100) 
) 

create table C(
    Id int primary key identity(1,1), 
    BId int, 
    Value varchar(100) 
) 

挿入:

insert into A values ('value A1') 
insert into A values ('value A2') 
insert into A values ('value A3') 

insert into B values(1, 'value B1') 
insert into B values(1, 'value B2') 
insert into B values(1, 'value B3') 

insert into C values(1, 'value C1') 
insert into C values(1, 'value C2') 
insert into C values(1, 'value C3') 

にはどうすればいいの同じ性能とスマートな方法で、必要なデータのみを返すことができます参加したり、より良いです?

コマンドは、クエリを実行するために使用されました:

select * from A 
left join B on A.Id = B.AId 
left join C on C.BId = B.Id 
where A.Id = 1 
+0

あなたが持っている私たちに伝えるために、あなたがデータを何をしたい形式を私たちは本当にその情報を提供することはできません。 –

+0

テーブルはどのように関連していますか?通常、 'join'に重複レコードが含まれているのは、' join'に含める必要があるフィールドを見落としたからです。 – alroc

+0

@ GordonLinoff私はちょうど赤でマークされたデータを避けたい – MuriloKunze

答えて

2

あなたが値の最初の出現返すようにrow_number()を使用することができます。

select A.Id, 
     (case when row_number() over (partition by a.id order by b.id, c.id) = 1 
      then a.value 
     end) as a_value, 
     B.id, 
     (case when row_number() over (partition by a.id, b.id order by c.id) = 1 
      then b.value 
     end) as b_value, 
     C.id, 
     C.value 
from A left join 
    B 
    on A.Id = B.AId left join 
    C 
    on C.BId = B.Id 
where A.Id = 1 
order by a.id, b.id, c.id; 
+0

ありがとう、それは期待どおりに動作します。 – MuriloKunze

関連する問題