Как исправить этот запрос SQL GROUP BY? - PullRequest
1 голос
/ 03 декабря 2009

У меня следующий запрос:

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 нет строк, соответствующих IPNumberID в tblIPNumbers, я не получаю возвращаемых строк. Я бы хотел, чтобы в этом случае запрос возвращал одну строку 0 для Count(dom.DomainID) AS CountOfDomains.

Я пробовал различные комбинации соединений LEFT и RIGHT, и это кажется простой проблемой, но мой SQL-фу сегодня низок.

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

Вы должны использовать LEFT JOIN s вместо JOIN s, а также учтите, что если LEFT JOIN не найдет подходящую строку в правой таблице, он вернет NULL s для любого поля из этот правильный стол.

Это означает, что ваша проблема исходит из вашего WHERE предложения, которое ссылается на dom.pointerto небезопасным способом, что фактически аннулирует преимущества LEFT JOIN.

1 голос
/ 03 декабря 2009

Измените JOIN s на LEFT JOIN, и они также будут содержать несоответствующие записи.

0 голосов
/ 03 декабря 2009

Попробуйте использовать внешнее объединение для таблиц 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) 
...