2016-08-08 12 views
0

Ich habe folgende Datenbankstruktur:Wie coalesce für doppelte Tabellen vermeiden

tblShelter
ShelterId
PetId
clientId
ShelterName
Adresse

tblClient
clientId
PetId

tblPet
PetId
petname

So, Haustier zu einem Schutz oder ein registrierten Obdach Client gehören kann (angenommen pet).

Also meine Shelter Tabelle hat Daten wie folgt:

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

Also, ich brauche alle PetNames für jeden Unterschlupf (Direkt Schutz Haustiere oder Kunden) erhalten

Hier ist meine Frage:

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 

Frage: Ist es möglich, diese Abfrage zu optimieren? Momentan sieht es nicht gut aus. Bitte beachten Sie, dass die Datenbankstruktur der Einfachheit halber gezeigt wird. Leider kann es nicht geändert werden. Ist es möglich, auf intelligente Weise Koaleszenz loszuwerden oder Unterabfrage loszuwerden? -

Antwort

1

Ja Ihre JOIN Reihenfolge ändern:

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 auf der Verbindung von zwei Tabellen nicht streng basierend - die ON Klauseln jede Tabelle verweisen können, die bereits beigetreten ist beitreten zu beiden Seiten des Stromes zu bilden . Hier erlauben wir also, dass die Verbindung zu tblPet entweder auf der direkten Referenz (über s.PetId) oder über die optional beigefügte tblClient basiert.

Natürlich können Sie weiterhin die obige Abfrage vereinfachen, indem eine intelligentere ON Bedingung für die zu tblPet beitreten zu machen - aber die Art und Weise, dies zu tun wäre, um die Funktion wieder einzuführen, die Sie zu vermeiden suchen sind - COALESCE. Ich habe keine Ahnung, was deine Gründe dafür sind, dieses Feature zu vermeiden.

+0

Hallo Damien, danke für deine Antwort. Ich versuche nicht, COALESCE per se zu entfernen. Ich möchte nur meine Abfrage vereinfachen und so effizient wie möglich machen. Können Sie erklären, wie Sie eine intelligentere "An" -Bedingung erreichen können? – user194076

+0

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

+0

Super! Lassen Sie mich das auf meiner Anfrage versuchen – user194076

Verwandte Themen