构建SQL查询的最佳方法

时间:2013-03-26 16:55:34

标签: sql sql-server database relational-database

我有几个数据库表:

  • Client(基本信息,名字,姓氏等)
  • Employer(基本信息,雇主姓名,传真,地址等)

如果需要,我会有一个连接两个表的联结表:

  • Client_Employer(ClientID,EmployerID)

所有这些表格都经过确认,准确,清晰的数据维护。

我有第四个表格仅供参考,数据既不干净也不可靠,因为它是由最终用户提供的,无法确认。

  • ClientEmployer(客户提供的有关其现任雇主的数据)

我想编写一个查询,如果Client_Employer表中存在记录,则返回客户/雇主数据,但如果不存在雇主信息,也会回退到ClientEmployer表。

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

我使用ISNULL()CASEIF/ELSE等查看了几个选项,但只是想看看其他人认为最好,最干净的方法是什么?< / p>

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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之间没有关系,这意味着你' ll只包含一些Client / Employer表中的数据。

希望它按预期工作。

答案 2 :(得分:0)

IF EXISTS的使用情况如何?看起来您可以非常轻松地检索存在的数据,或者在示例中从ClientEmployer中选择不存在的数据。

相关问题