2015-08-14 6 views
0

У меня есть таблица контактов, и в этой таблице есть уровень контакта и levelID. Таким образом, контакт может быть администратором, помощником, другом и т. Д. На каждом из этих уровней есть своя таблица, поэтому прямо сейчас, чтобы получить все контакты и информацию, у меня есть запрос с серией уровней, каждый со своим собственным запросом, например,Замена SQL Union

SELECT Admin.AdminDescripiton, Contact.ContactTypeID, Contact.LevelID, Contact.FundID, etc. 
FROM Contact INNER JOIN Admin ON Contact.LevelID = Admin.AdminID 
WHERE (Contact.LevelID = 1) 

UNION 

SELECT Assistant.AssistantDescripiton, Contact.ContactTypeID, Contact.LevelID,Contact.FundID, etc. 
FROM Contact 
    INNER JOIN Assistant ON Contact.LevelID = Assistant. AssistantID 
WHERE 
    (Contact.LevelID = 2) 

UNION 

SELECT Friend.FriendDescripiton, etc 
FROM Contact 
    INNER JOIN Friend ON Contact.LevelID = Friend. FriendID 
WHERE 
    (Contact.LevelID = 3) 

Есть ли способ вставить это в оператор case или какой-либо другой тип соединения, который мог бы заменить союзы только одним выбором?

ответ

0

Это не совсем ясно, что ваши таблицы и данные выглядят, но, возможно, вы могли бы использовать левый присоединяется так:

SELECT 
    COALESCE(AdminDescripiton, AssistantDescripiton, FriendDescripiton) AS Description 
    , c.ContactTypeID 
    , c.FundID 
    , c.LevelID 
FROM contact c 
LEFT JOIN Admin ON c.LevelID = Admin.AdminID AND (c.LevelID = 1) 
LEFT JOIN Assistant ON c.LevelID = Assistant.AssistantID AND (c.LevelID = 2) 
LEFT JOIN Friend ON c.LevelID = Friend.FriendID AND (c.LevelID = 3) 

Оператор coalesce возвращает первое ненулевое значение от его аргументов.

+1

Это было спасибо – Luckbox72

0

Похоже, что LEFT JOIN может работать.

SELECT Assistant.AssistantDescripiton, Contact.ContactTypeID, Contact.LevelID, Contact.FundID, ... 
FROM Contact 
LEFT JOIN ADMIN ON Contact.LevelID = ADMIN.AdminID 
       AND Contact.LevelID = 1 
LEFT JOIN Assistant ON Contact.LevelID = Assistant.AssistantID 
        AND Contact.LevelID = 2 
0

Я собирался сказать почти то же самое, что сделал JPW, но я использовал случай заявление, а не метод срастаться. Я думаю, что он чище.