2009-12-03 65 views
1

我有以下查询:如何修复此SQL GROUP BY查询?

SELECT 
    dev.DeviceName, Count(dom.DomainID) AS CountOfDomains 
FROM 
    tblDevices dev 
JOIN 
    tblIPNumbers ip ON dev.DeviceName = ip.ServerName 
JOIN 
    tblDomains dom ON dom.IPNumberID = ip.IPNumberID 
WHERE 
    dom.PointerTo=0 
    AND dev.DeviceType='3' 
    AND (dev.[System]='32' OR dev.[System]='33') 
    AND dom.ClosedDate IS NULL AND dev.Active=1 
GROUP BY 
    dev.DeviceName 
ORDER BY 
    Count(dom.DomainID) 

的表格看起来像:

 
tblDomains 
========== 
DomainID  int 
IPNumberID  int 
ClosedDate  datetime 
PointerTo  int 

tblIPNumbers 
============ 
IPNumberID  int 
ServerName  varchar(200) 

tblDevices 
========== 
DeviceID  int 
DeviceName  varchar(200) 
System   varchar(10) 
DeviceType  varchar(10) 
Active   bit 

样本数据:

 
tblDomains: 
=========== 
DomainID: 1234 IPNumberID: 1000 ClosedDate: NULL PointerTo: 0 

tblIPNumbers: 
============= 
IPNumberID: 1000 ServerName: WIN2008-01 

tblDevices: 
=========== 
DeviceID: 1 DeviceName: WIN2008-01  System: 32 Active: 1 DeviceType: 3 

的问题是,如果在tblDomains没有行匹配一个IPNumberIDtblIPNumbers我没有返回行。在这种情况下,我希望查询返回0的单行Count(dom.DomainID) AS CountOfDomains

我试过LEFTRIGHT连接的各种组合,它似乎是一个简单的问题,但我今天的SQL-fu很低。

+0

会发生什么事,当你更换'JOIN与'LEFT JOIN tollon.tblDomains' tollon.tblDomains'? – 2009-12-03 10:54:49

回答

1

您应该使用LEFT JOIN!而非JOIN秒,也提防,当LEFT JOIN不右表中找到匹配的行,它会为任何领域从右表返回NULL秒。

这意味着您的问题来自您的WHERE子句,该子句以非NULL安全方式引用dom.pointerto,这将有效地使LEFT JOIN无效。

+0

啊,是的,所以你可能想指定WHERE(dom.pointerto = 0或dom.pointerto IS NULL)...' – 2009-12-03 11:02:22

+0

PP和Romain的答案组合得到了这个工作。谢谢大家的快速工作。 – Kev 2009-12-03 11:26:52

1

将您的JOIN s更改为LEFT JOIN,它们也会包含不匹配的记录。

+0

我试过了,但可悲的是不起作用。 – Kev 2009-12-03 10:54:24

+0

真的吗?你会得到一个错误,或只是你目前的行为? – 2009-12-03 10:56:44

+1

它认为它来自WHERE子句。看到我的回答;) – Romain 2009-12-03 11:00:39

0

尝试使用外连接表tbldomains


SELECT 
    dev.DeviceName, Count(dom.DomainID) AS CountOfDomains 
FROM 
    tblDevices dev 
JOIN 
    tblIPNumbers ip ON dev.DeviceName = ip.ServerName 
outer JOIN 
    tblDomains dom ON dom.IPNumberID = ip.IPNumberID 
WHERE 
    dom.pointerto=0 
    AND dev.devicetype='3' 
    AND (dev.[System]='32' OR dev.[System]='33') 
    AND dom.ClosedDate IS NULL AND dev.active=1 
GROUP BY 
    dev.DeviceName 
ORDER BY 
    Count(dom.DomainID) 
+0

提示:在您的代码周围添加

...
以使其他人更容易阅读 – 2009-12-03 11:21:14