我有几个数据库表:
Client
(基本信息,名字,姓氏等)Employer
(基本信息,雇主姓名,传真,地址等)如果需要,我会有一个连接两个表的联结表:
Client_Employer
(ClientID,EmployerID)所有这些表格都经过确认,准确,清晰的数据维护。
我有第四个表格仅供参考,数据既不干净也不可靠,因为它是由最终用户提供的,无法确认。
ClientEmployer
(客户提供的有关其现任雇主的数据)我想编写一个查询,如果Client_Employer
表中存在记录,则返回客户/雇主数据,但如果不存在雇主信息,也会回退到ClientEmployer
表。
Employer
中的列与ClientEmployer
中的列完全匹配。
我使用ISNULL()
,CASE
,IF/ELSE
等查看了几个选项,但只是想看看其他人认为最好,最干净的方法是什么?< / p>
答案 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.id
是NULL
(WHERE
子句),那么客户/雇主表中的给定Client.id
之间没有关系,这意味着你' ll只包含一些Client / Employer表中的数据。
希望它按预期工作。
答案 2 :(得分:0)
IF EXISTS的使用情况如何?看起来您可以非常轻松地检索存在的数据,或者在示例中从ClientEmployer中选择不存在的数据。