2011-08-18 19 views
1

に参加し、私の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] 

私だけtblUNIX_Archiveテーブルにある例外表にはないユニークなIPアドレスを確認する必要があります。私は複数のレコードを取得しています。私は上記のSQLで何が間違っていますか?あなたが参加を使用する必要はありません別ではない一つのテーブル内のレコードを選択する

答えて

1

、あなたは

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] 
+0

が要件を満たしています。 – Yves

+1

NOT IN()の代わりにNOT EXISTS()クエリタイプを試すこともできます。インデックスの選択に応じてより良いパフォーマンスを示すことがあります – Einacio

2

@Einacioしていない使用する必要があり、あなたのソリューションが動作しますが、私は思いますwhere句にINを入れないとパフォーマンスが低下します。レコードが多い場合はひどいこともあります。

@Kombuchaは、ここにあなたが試すことができるものである。

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

これはインタビューで古典的なSQLの質問です。外部結合= A +、/存在しない= C、他の何か= F. –

+0

@Nitin Singhaiあなたのソリューションも同様に動作します。私はuser92546によって上記の解決策と同じくらい好きです。私は1を選ぶことができます.... user92546の解決策が最初に現れました。 Thx 2u2;) – Yves

+1

あなたは大歓迎です:) – legendofawesomeness

1

左側の外部結合は、右側の行と一致しない場合でも、左側のテーブルから行を返します。 UnixのIPアドレスがすべて必要なので、左に置いてください。 (または、右外部結合に切り替えます。)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] 
+0

<3 it !!!!魅力のように働きます:あなたの助けと左/右の外の結合のためのヒントのためのthx百万。うわー!最高のuser92546 – Yves