Помощь с левым соединением - PullRequest
1 голос
/ 18 августа 2011

Ниже мой sql:

SELECT DISTINCT
    U.[IP Address],
    U.[Risk Rating],
    COUNT( U.[IP Address] ) AS UNIXIP,
    COUNT( U.[Risk Rating] ) RATINGCOUNT
FROM
    Exception AS E
LEFT JOIN
    tblUNIX_Archive AS U
        ON E.IP_address <> U.[IP Address]  -- Is using '<>' ok? instead of =
        AND (U.ScanDate BETWEEN '2011-01-22' AND '2011-02-18')
group by
    U.[Risk Rating],
    U.[IP Address]
ORDER BY
    U.[Risk Rating],
    U.[IP Address]

Мне нужно только увидеть уникальный IP-адрес, которого нет в таблице исключений, которые находятся в таблице tblUNIX_Archive. Я получаю несколько записей. Что я делаю не так с вышеуказанным sql?

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

@ Einacio, пока ваше решение будет работать, я думаю, что NOT IN в предложении where может привести к снижению производительности - может быть даже плохо, если записей больше.Вы можете попробовать:

    SELECT DISTINCT
    U.[IP Address],
    U.[Risk Rating],
    COUNT( U.[IP Address] ) AS UNIXIP,
    COUNT( U.[Risk Rating] ) RATINGCOUNT
FROM
    tblUNIX_Archive AS U
LEFT JOIN
    Exception AS E
        ON E.IP_address = U.[IP Address]  -- = to is better 
        AND (U.ScanDate BETWEEN '2011-01-22' AND '2011-02-18')
where E.IP_adress is null
group by
    U.[Risk Rating],
    U.[IP Address]
ORDER BY
    U.[Risk Rating],
    U.[IP Address]

Обновление: заметил, что объединенные таблицы были в неправильном порядке ... исправил это.

1 голос
/ 18 августа 2011

Левое внешнее соединение вернет строки из левой таблицы, даже если они не соответствуют строкам справа.Поскольку вам нужны все IP-адреса Unix, они должны быть слева.(Или переключитесь на правое внешнее соединение.) Предложение WHERE отклоняет соответствующие строки.

SELECT DISTINCT
    U.[IP Address],
    U.[Risk Rating],
    COUNT( U.[IP Address] ) AS UNIXIP,
    COUNT( U.[Risk Rating] ) RATINGCOUNT
FROM
    tblUNIX_Archive AS U left outer join
    Exception AS E ON E.IP_address = U.[IP Address] AND
        (U.ScanDate BETWEEN '2011-01-22' AND '2011-02-18')
WHERE
    E.IP_address is NULL
group by
    U.[Risk Rating],
    U.[IP Address]
ORDER BY
    U.[Risk Rating],
    U.[IP Address]
1 голос
/ 18 августа 2011

, чтобы выбрать записи в одной таблице, которых нет в другой, вам не нужно использовать соединение, вы должны использовать NOT IN

SELECT DISTINCT
    U.[IP Address],
    U.[Risk Rating],
    COUNT( U.[IP Address] ) AS UNIXIP,
    COUNT( U.[Risk Rating] ) RATINGCOUNT
FROM
    tblUNIX_Archive AS U
where  U.[IP Address] NOT IN( select E.IP_address  from Exception AS E)
        AND (U.ScanDate BETWEEN '2011-01-22' AND '2011-02-18')
group by
    U.[Risk Rating],
    U.[IP Address]
ORDER BY
    U.[Risk Rating],
    U.[IP Address]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...