2013-03-26 129 views
0

我在sql server中有一个查询,显示我不想要的几条记录。这些字段的关系如下:不包括匹配条件的选择查询中的记录

ClientID可以具有多个工作负载(WorkloadIDs),但不能相反(一对多)。 每个WorkloadID都有一个分配给它的单位。 每个WorkloadID都有一个分配给它的DWLD(日期)。 多个WorkloadID可以具有相同的ClientID,DWLD和Unit。

下面是该查询:

select 
w.WorkloadID, 
w.ClientID, 
w.Unit, 
w.DWLD 

     from 
     Workload as w 
     left JOIN Clients as cli 
     ON w.ClientID = cli.ClientID 

    where 

     w.DWLD >= @start AND w.DWLD < @enddate 
     and w.IsDeleted <> 1 

我希望它不是只显示1记录出的具有相同客户端ID和相同的单元和相同DWLD可用记录几号的。我试图自我加入表,使用having子句和not exists子句,但没有得到正确的结果。

的感谢!

Data displayed from the query

Source Table

+0

而是一个字的问题,能你显示样本数据和期望的结果? – 2013-03-26 21:49:16

+0

http://i.stack.imgur.com/C3fiI.png – 2013-03-26 22:14:29

+0

理想的结果对我没有意义。你想排除红色的行?为什么我们保留WorkloadID 108和131,但拒绝130?源表中没有包含在屏幕截图中的行吗?确定查询以在电子表格的屏幕截图中产生结果而不知道源数据是什么样子是非常困难的。您能否提供问题中的表格样本数据和表格结果? – 2013-03-26 22:22:39

回答

0

尝试此查询。如果您没有从clients表中检索记录,则无需加入该记录。

select w.WorkloadID, w.ClientID, w.Unit, w.DWLD 
from Workload as w 
where w.DWLD BETWEEN @start AND @enddate 
and w.IsDeleted <> 1 
AND NOT EXISTS (SELECT * FROM Workload 
WEHRE ClientId = w.clientid 
and unit = w.unit and dwld = w.dwld 
and workloadid < w.workloadid 
and DWLD BETWEEN @start AND @enddate 
AND IsDeleted <> 1) 
0

如果列中的值DWLD由小时/分钟不同,你希望他们通过天使用CAST(CAST(DWLD为float)为INT)分组

select 
max(w.WorkloadID) as WorkloadID, 
w.ClientID, 
w.Unit, 
w.DWLD 

     from 
     Workload as w 
     left JOIN Clients as cli 
     ON w.ClientID = cli.ClientID 

    where 

     w.DWLD >= @start AND w.DWLD < @enddate 
     and w.IsDeleted <> 1 

group by w.ClientID, 
w.Unit, 
w.DWLD 
相关问题