2016-08-08 15 views
0

のための合体を避けるために、私は次のデータベースの構造を有する:どのように重複するテーブル

tblShelter
ShelterId
PetId
ClientIdを
ShelterName
住所

tblClient
ClientIdを
PetId

tblPet
PetId
PetName

ので、ペットは避難所に避難所または登録クライアント(採択ペット)に属することができます。次のようにだから私のシェルターのテーブルにデータがある

は:

ShelterId PetId ClientId ShelterName 
    1  100 NULL  Test 
    1  NULL 101  Test 
    1  102 NULL  Test 

だから、私は、各避難所のためのすべてのPetNames(直接避難所のペットやクライアント)

を取得する必要があります。ここに私のクエリです:

Select Coalesce(p.PetName, pclient.PetName) as PetName 
from tblShelter s 
Left Join tblPet p 
on p.PetId = s.PetId 
Left Join (select p2.PetId, p2.PetName 
      from tblClient c 
      join tblPet p2 
      on c.PetId = p2.PetId) pclient 
on s.PetId = pclient.PetId 
where shelterId=1 

質問:このクエリを最適化することは可能ですか?現在、それはかなり見えません。簡単にするためにデータベース構造が示されています。残念ながら、変更することはできません。スマートな方法で合体を取り除くことができますか、またはサブクエリを取り除くことは可能ですか?

答えて

1

はい - ごJOIN順序を変更します。

Select p.PetName 
from tblShelter s 
Left Join tblClient c 
    on s.ClientId = c.ClientId 
inner join tblPet p 
    on p.PetId = s.PetId or 
     p.PetId = c.PetId 
where shelterId=1 

JOIN sが厳密に2つのテーブルを結合に基づくものではありません - ON句は、すでに参加し、現在のいずれかの側を形成するために結合された任意のテーブルを参照することができます。そこでここでは、tblPetへの参加を、直接参照(s.PetId経由)または任意でtblClientに参加させることによって行うことができます。しかし、あなたが避けるために探している機能再導入することであろうことを行う方法 - - COALESCE

はもちろん、あなたがさらにtblPetに参加するために賢くON条件を作ることによって上記のクエリを簡素化することができます。私はあなたの理由がその機能を回避しようとしているのかどうか分かりません。

+0

こんにちはダミアン、あなたの返信ありがとうございます。私はCOALESCE自体を削除するつもりはない。単にクエリを簡略化し、可能な限り効率的にしたいと考えています。よりスマートな「オン」状態を実現する方法について説明できますか? – user194076

+0

@ user194076 - 'p.PetId = COALESCE(s.Petid、c.PetId)' –

+0

恐ろしいです!私の質問でこれを試してみましょう – user194076

関連する問題