2015-10-27 34 views
1

我幾次遇到過這個問題,我不知道如何解決它。我有一個查詢需要訪問同一個表兩次,以挑出兩個不同的人:一個顧問和客戶聯繫人。在SQL Server中搜索兩次表

顧問+客戶查詢看起來像這樣

select 
    CRM7.contact.contact_id as CustomerID, 
    CRM7.contact.name + ' ' + CRM7.person.firstname + ' ' + CRM7.person.LASTNAME as CustomerName, 
    CRM7.person.firstname + ' ' + CRM7.person.lastname as ConsultantName, 
    CRM7.udcontactsmall.long08 as WriteLic, 
    CRM7.udcontactsmall.long17 as ReadLic, 
    CRM7.udcontactsmall.long09 as HasMaint, 
    CRM7.udlist.name as BCVer 
from 
    CRM7.contact, 
    CRM7.udcontactsmall 
left join 
    CRM7.associate on CRM7.udcontactsmall.long11 = CRM7.associate.associate_id 
left join 
    CRM7.person on CRM7.associate.person_id = CRM7.person.person_id 
left join 
    CRM7.udlist on CRM7.udcontactsmall.long07 = CRM7.udlist.UDList_id 
where 
    CRM7.contact.category_idx = '2' and 
    CRM7.contact.userdef_id = CRM7.udcontactsmall.udcontactsmall_id 
order by 
    CRM7.contact.name 

和得到每個客戶的接觸看起來像這樣

SELECT 
    C.NAME+' Kontakt '+ P.FIRSTNAME+' '+P.LASTNAME AS CONTACT 
FROM 
    CRM7.PERSON P 
LEFT OUTER JOIN 
    CRM7.CONTACT C ON P.CONTACT_ID = C.CONTACT_ID 
WHERE 
    C.CATEGORY_IDX IN ('2','5') 
    AND P.RETIRED = 0 
ORDER BY 
    C.NAME, P.LASTNAME, P.FIRSTNAME 

Dataset中的一個:

http://oi61.tinypic.com/2j66cjq.jpg

如何我得到一個查詢,它返回顧問爲客戶和客戶聯繫?

+4

不要如果您確實需要LEFT JOIN,請將這些右側表條件放在WHERE子句中。 (如果你這樣做,你會得到內連接行爲。)移動到ON子句以獲得true LEFT JOIN執行。 – jarlh

+1

好奇你爲什麼在同一個表中存儲顧問和客戶 – Takarii

+0

@jarlh - 正如你所看到的,where子句在用左連接連接的表上沒有任何條件,所以雖然你的語句是真的,但它不會在這種情況下有任何影響。 – Adish

回答

0

這應該成爲你的目的:

select 
    CRM7.contact.contact_id as CustomerID 
    ,CRM7.contact.name+' '+CRM7.person.firstname+' '+CRM7.person.LASTNAME as CustomerName 
    ,CRM7.person.firstname+' '+CRM7.person.lastname as ConsultantName 
    ,CRM7.udcontactsmall.long08 as WriteLic 
    ,CRM7.udcontactsmall.long17 as ReadLic 
    ,CRM7.udcontactsmall.long09 as HasMaint 
    ,CRM7.udlist.name as BCVer 
    ,C.NAME+' Kontakt '+ CRM7.person.FIRSTNAME+' '+ CRM7.person.LASTNAME AS CONTACT 
from 
    CRM7.contact 
    ,CRM7.udcontactsmall 
    left join CRM7.associate on CRM7.udcontactsmall.long11=CRM7.associate.associate_id 
    left join CRM7.person on CRM7.associate.person_id=CRM7.person.person_id 
    left join CRM7.udlist on CRM7.udcontactsmall.long07=CRM7.udlist.UDList_id 
    LEFT OUTER JOIN (SELECT CONTACT_ID,NAME FROM CRM7.CONTACT WHERE CATEGORY_IDX in ('2','5') AND P.RETIRED=0) C ON CRM7.person.CONTACT_ID=C.CONTACT_ID 
where 
    CRM7.contact.category_idx='2' 
    and CRM7.contact.userdef_id=CRM7.udcontactsmall.udcontactsmall_id 
order by 
    CRM7.contact.name 

我用從第二查詢上的接觸表的連接並將其添加到第一個獲得客戶聯繫:

LEFT OUTER JOIN 
    (SELECT CONTACT_ID, NAME 
    FROM CRM7.CONTACT 
    WHERE CATEGORY_IDX IN ('2','5') AND P.RETIRED = 0) C ON CRM7.person.CONTACT_ID = C.CONTACT_ID 
+0

嗨我不需要 左外部聯接CRM7.CONTACT C上P.CONTACT_ID = C.CONTACT_ID 在那個左外部聯接工作? – ebrodje

+0

不,您已在FROM語句中擁有person表。 – Adish

+0

是的,我現在看到。它給出了一個錯誤「無效的列名稱Retired'- 刪除其運行查詢,並讓空值。 – ebrodje