2013-03-26 101 views
0

我有幾個數據庫表:最佳方式構建SQL查詢

  • Client(基本信息,姓氏,名字等)
  • Employer(基本信息,工作單位名稱,傳真,地址,等)

然後我有一個結合錶鏈接兩個表如果需要的話:

  • Client_Employer(ClientID,EmployerID)

所有這些表格都以確認,準確,清晰的數據進行維護。

我有第四張表僅用於提供信息,數據既不乾淨也不可靠,因爲它由最終用戶提供,無法確認。

  • ClientEmployer(關於他們目前的僱主客戶端提供數據)

我想寫如果Client_Employer表中存在的記錄,返回客戶端/僱主數據的查詢,同時也將回退到如果不存在其他用戶信息,則表ClientEmployer

Employer中的列與ClientEmployer中的列完全匹配。

我看了幾個選項使用ISNULL(),CASE,IF/ELSE等,但只是想看看別人認爲最好的,最乾淨的方式來做到這一點將是?

+0

想想你有你自己的表名在你的描述混淆。 'Employer_Client'在哪裏? – 2013-03-26 16:57:33

+0

你能指定表之間的關係嗎?或者表格如何相互關聯。 – 2013-03-26 16:58:44

+0

錯字...修正。應該是Client_Employer。 – Hunter 2013-03-26 16:59:15

回答

0

我認爲你應該使用ISNULL()LEFT JOIN Employer,像這樣:

SELECT 
    Client.*, 
    Employer.* 
FROM Client 
LEFT JOIN Client_Employer 
ON Client_Employer.client_id = Client.id 
LEFT JOIN ClientEmployer 
ON ClientEmployer.client_id = Client.id 
LEFT JOIN Employer 
ON Employer.id = ISNULL(Client_Employer.employer_id, ClientEmployer.employer_id) 
WHERE Employer.id IS NOT NULL; 

如果某些Employer.idNULLWHERE條款),所以沒有任何來自兩個客戶端/僱主表給定Client.id的關係,這意味着您將只擁有某些客戶/僱主表中的數據。

希望它按照您的期望工作。

0

IF EXISTS的使用情況如何?似乎你可以很容易地檢索到它存在的數據,否則從你的例子中的ClientEmployer中選擇它不存在的地方。

1

好,使有關架構ClientEmployer表中的幾個假設,我結合了UNION和EXISTS像這樣:

SELECT 
    cl.ClientID as ClientID, 
    em.EmployerID as employerID, 
    cl.firstname, 
    cl.lastname, 
    em.employername, 
    em.fax, 
    em. address 
FROM 
    Client cl, 
    Employer em, 
    Client_Employer ce 
WHERE 
    cl.ClientID = ce.ClientID 
    and em.EmployerID = ce.EmployerID 
UNION 
SELECT 
    Clem.ClientID as clientID, 
    -1 as EmployerID, 
    clem.firstname, clem.lastname, 
    clem.employername, 
    clem.fax, 
    clem.address 
FROM 
    ClientEmployer clem 

WHERE 
    NOT EXISTS (
        SELECT * FROM Client cl, Employer em, Client_Employer ce 
        WHERE cl.ClientID = ce.ClientID 
         and em.EmployerID = ce.EmployerID 
         and clem.ClientID = cl.ClientID 
         and clem.EmployerName = ce.EmployerName)