0

我正在使用 ColdFusion 8 开发我公司的网站,并希望从一个表 ( ) 中返回一个记录列表(只是clientname字段),该表 ( dbo.clients) 在不同的表 ( ) 中没有匹配项,dbo.fees以提示最终用户添加这些公司的收费表。一个例子:

dbo.clients

CLIENT_ID CLIENT_NAME
1         Joe's Diner
2         Save-a-Lot
3         Family Meds
4         DiFazio's

dbo.fees

CID        CLIENT_NAME  FEE
1          Joe's Diner  25.000
2          Save-a-Lot   35.000
4          DiFazio's    30.000

我想要的是一个结果集,在上述表格/数据的情况下,将仅返回 clientid/clientname 3/Family Meds,因为它们没有在表格中列出/记录费用dbo.fees。我的数据库是 MSSQL 2005。我的查询是:

SELECT clientid 
FROM clients 
INNER JOIN fees 
  ON clients.clientid <> fees.cid;

它返回 50,000 多个结果的笛卡尔积。使用LEFT/RIGHT OUTER JOIN仍然给我一个笛卡尔积,并DISTINCT简单地返回每条记录,dbo.clients无论它们是否有dbo.fees条目。我究竟做错了什么?

ps 另外值得注意的是:我之前的管理员显然没有在客户/费用表之间建立 PK/FK 关系,因此任何可能依赖的查询语法在这种情况下都可能不起作用。它可能必须仅基于相关字段的值来工作。

4

2 回答 2

1

您可以使用LEFT JOINwithWHERE子句,该子句将仅返回那些未出现在fees表中的记录:

select c.CLIENT_ID, c.CLIENT_NAME
from clients c
left join fees f
    on c.CLIENT_ID = f.CLIENT_ID
where f.CLIENT_ID is null

如果您需要帮助学习JOIN语法,这里有一个很好的参考:

这也可以使用 a 来编写NOT EXISTS

select *
from clients c
where not exists (select CLIENT_ID
                    from fees f
                    where c.CLIENT_ID = f.CLIENT_ID)

请参阅两个查询的SQL Fiddle 演示

于 2013-03-05T15:06:38.280 回答
1

最简单的,你可以只使用NOT IN;

SELECT clientid FROM clients WHERE clientid NOT IN
  (SELECT clientid FROM fees)

...或者您可以使用 LEFT JOIN 更详细地执行相同的操作;如果客户不存在费用,f.clientid 将为 NULL。

SELECT c.clientid
FROM clients c
LEFT JOIN fees f
ON c.clientid = f.clientid
WHERE f.clientid IS NULL
于 2013-03-05T15:07:21.913 回答