2016-08-08 3 views
0

У меня есть следующая структура базы данных:Как избежать COALESCE дубликатов таблиц

tblShelter
ShelterId
PetId
ClientId
ShelterName
Адрес

tblClient
ClientId
PetId

tblPet
PetId
PetName

Так, Pet может принадлежать убежище или зарегистрированному клиенту убежище (подаренный).

Так что мой Shelter таблица содержит следующие данные:

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 не строго на основе объединения двух таблиц - в ON положения могут ссылаться на любую таблицу, которая уже присоединились, чтобы сформировать любую сторону тока присоединиться , Таким образом, мы разрешаем присоединение к tblPet на основе либо прямой ссылки (через s.PetId), либо через необязательно соединенную в tblClient.

Конечно, вы можете еще больше упростить приведенный выше запрос, сделав умную ON условия для объединения в tblPet - но способ сделать это было бы вновь ввести функцию вы ищете, чтобы избежать - COALESCE. Я понятия не имею, почему ваши причины направлены на то, чтобы избежать этой функции.

+0

Привет, Дэймиен, благодарю вас за ответ. Я не пытаюсь удалить COALESCE как таковой. Просто хочу упростить мой запрос и сделать его максимально эффективным. Можете ли вы объяснить, как достичь более умного состояния? – user194076

+0

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

+0

Удивительный! Позвольте мне попробовать это по моему запросу – user194076

Смежные вопросы