0

我有几个数据库表:

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

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

  • Client_Employer(客户 ID、雇主 ID)

所有这些表格都使用经过确认的、准确的、干净的数据进行维护。

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

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

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

中的列与 中的列Employer完全相同ClientEmployer

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

4

3 回答 3

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)
于 2013-03-26T17:37:28.997 回答
0

我认为你应该使用ISNULL()to 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,这意味着您将只有一些客户/雇主表中的数据。

希望它按您的预期工作。

于 2013-03-26T17:21:57.860 回答
0

IF EXISTS 的用法呢?似乎您可以很容易地检索存在的数据,否则在您的示例中从 ClientEmployer 中选择不存在的数据。

于 2013-03-26T17:22:13.723 回答