2012-06-06 4 views
0

У меня есть две таблицы Profile_Appointments и Profile.Несколько соединений в одной таблице

Каждая запись в таблице профилей имеет Profile_key и Profile_Type_Key в дополнение к другим данным профиля - фамилия, имя и т.д.

Rep нам иметь Profile_Type 4, клиентов имеют Profile_Type 6

PROFILE TABLE 
Profile_Key Profile_Type_key First_Name  Last_Name 
    1234     4    John   Smith 
    8765     6    Mike   Jones 

таблица Profile_Appointment содержит две записи для каждого назначения один с РЭП в Profile_Key другой с Profile_Key клиента

Appointment_Key  Profile_Key  
    10     1234 
    10     8765     

Назначение_key относится к таблице Назначения.

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

THE RESULT I WANT 
Appointment_Key Profile_Key Rep Profile_Key Customer 
    10    1234     8765 

Это запрос, который не работает ...

select appointment_key, p.profile_key as Rep, p2.profile_key as Customer, p.firs_name,p2.first_name from profile_appointment pa 

    join profile p 
    on p.profile_key = pa.profile_key 

    join profile p2 
    on p2.profile_key = pa.profile_key 

    where p.profile_type_key = '4' or p2.profile_type_key = '6' 

Что я получаю:

Appointment_Key  Rep  Customer  Rep  Customer 
    10    1234  1234  John  John 

Я не могу понять, что я пропавшими без вести. Спасибо.

+1

Вы, кажется, выбрав только по одной строке за раз от встречи с профилем, поэтому у вас будет только один Profile_Key для присоединения. – Ilion

+0

Разве вы не выполнили бы ту же самую вещь, придерживающуюся только одной таблицы с тем же, где клаузула ??? –

ответ

0

Вы должны удовлетворять обоим условиям, так что вам нужно, и вместо ИЛИ

select pa.appointment_key, p.profile_key as Rep, p2.profile_key as Customer, 
     p.first_name as RepName,p2.first_name as CustomerName 
from profile_appointment pa  
join profile_appointment pa2 on pa.appointment_key = pa2.appointment_key 
join profile p on p.profile_key = pa.profile_key and p.profile_type_key = '4' 
join profile p2 on p2.profile_key = pa2.profile_key and p2.profile_type_key = '6' 
+0

Ни один из этих вариантов не возвращает желаемый результат. Просто заменив OR на AND, получим 0 результатов. Второй запрос, использующий левые соединения, почти корректен, но возвращает две строки, один с данными rep, а другой с данными клиента. – Seth

+0

Вы правы, я пропустил, что у этой встречи было две записи. Редактирование. – HLGEM

1
SELECT a1.appointment_key, a1.profile_key rep, a2.profile_key customer 
    FROM appointment a1 
    INNER JOIN profile p1 ON a1.profile_key = p1.profile_key AND p1.profile_type_key = 4 
    INNER JOIN appointment a2 ON a1.appointment_key = a2.appointment_key 
    INNER JOIN profile p2 ON a2.profile_key = p2.profile_key AND p2.profile_type_key = 6 

EDIT: Вы можете найти гнездовые выбирает более читаемым:

SELECT reps.appointment_key, reps.profile_key rep, customers.profile_key customer 
    FROM (
    SELECT appointment.* 
     FROM appointment 
     INNER JOIN profile ON appointment.profile_key = profile.profile_key AND profile_type_key = 4 
) reps 
    INNER JOIN (
    SELECT appointment.* 
     FROM appointment 
     INNER JOIN profile ON appointment.profile_key = profile.profile_key AND profile_type_key = 6 
) customers ON reps.appointment_key = customers.appointment_key 
Смежные вопросы