2016-10-07 11 views
2

データを先に抽出していましたが、結果が多すぎて使用できませんでした(400万行以上が返されました)。私は、犯人が多数のIDを持つ数え切れないほどの数であることを発見しました。IDが存在する行の数に基づいてSQLクエリから行を除外します

データの構造を強調します。私は2つのテーブルを持っています。 tbl1には、すべてのATID(ATIDは基本的に縮尺ID)のレコードが1つあります。各ATIDは本質的に独自のテーブルですが、スケール上のすべてのアイテムのレコードがあります。 tbl2はそれらのアイテムを列挙します - それはATIDごとのスケール項目ごとに行を持っています。したがって、各ATIDには1〜50万行のどこかがあります(私は知っていますが、余計なことがあります)。

100行を超えるATIDを除外したいと思います。 FYIこれは私が読み取り専用アクセス権を持っているデータベースです。私が好きな私の最終製品について

select ATID, count(*) as row_count 
from tbl2 
group by ATID 
order by row_count desc; 

SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg 
FROM tbl1 LEFT OUTER JOIN tbl2 ON (tb1.ATID = tbl2.ATID); 

ここで私はATIDあたりTBL2にATIDsとレコード数のリストを取得するために使用クエリがあります:

はここに私の元のクエリですtbl2で100行未満のATIDのみを返すようにします。しかし、row_count変数を使用して2番目のクエリにWHERE句を追加しようとしても失敗します。だから私は2つのクエリを結合してWHERE句を取得する方法にもわからない。

私が唯一の選択肢は、レコードが多すぎることを知っているときにATIDを除外することだが、 (すなわち、等.... WHERE = 1016 ATID NOT AND = 554をATID AND NOT NOTを使用)あなたはすでにそれをやった

+0

サブクエリの実行方法は分かりますか? –

答えて

3

を、あなたは自分の2つのクエリを一緒に置く必要があります。

SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg 
FROM tbl1 LEFT OUTER JOIN tbl2 ON (tb1.ATID = tbl2.ATID) 
WHERE tbl1.ATID NOT IN (
    select ATID 
    from tbl2 
    group by ATID 
    HAVING COUNT(*) >= 100 
) 
3

これを行うには1つの方法があります

Count() Over()ウィンドウ集計countATIDのレコード数はtbl2です。あなたはtabl1からすべてのATID'sをたくない場合は、ATID'sのカウントを取得しますので、その後Where句にtbl2.cnt <= 100条件を移動:次にATIDJoinで条件

SELECT tbl1.ATID, 
     tbl1.ATDesc, 
     tbl2.AValue, 
     tbl2.ADesc, 
     tbl2.APosNeg 
FROM tbl1 
     LEFT OUTER JOIN (SELECT Count(1)OVER(partition BY ATID) AS cnt,* 
         FROM tbl2) tbl2 
        ON tb1.ATID = tbl2.ATID 
         AND tbl2.cnt <= 100; 

は注意をフィルタリングするために使用することができます数えますカウントが100未満tbl2

1

SQLサーバーでは、(サブクエリよりも速い)CTEを使用します。また、クエリ内の不要な括弧2番目のクエリのために

with RowCo as 
(
select ATID, count(*) as row_count 
from tbl2 
group by ATID 
having row_count <= 100 
) 

SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg 
FROM tbl1 
inner join RowCo 
    on RowCo.ATID = tbl1.ATID 
LEFT JOIN tbl2 
    ON tb1.ATID = tbl2.ATID 
+0

ありがとうございます - サブクエリよりもCTEが高速になるのはなぜですか? – user2784067

1

、集約関数に関連したフィルタは、HAVING節

select ATID, count(*) as row_count 
from tbl2 
group by ATID 
order by row_count desc; 
having count(*) < 100 

そして、あなたは、単にサブクエリ

を使用することができます最初のクエリのために行きます
SELECT tbl1.ATID, tbl1.ATDesc, tbl2.AValue, tbl2.ADesc, tbl2.APosNeg 
FROM tbl1 
    LEFT OUTER JOIN tbl2 ON (tb1.ATID = tbl2.ATID) 
WHERE tbl1.ATID in (select ATID 
        from tbl2 
        group by ATID 
        having count(*) < 100) 
関連する問題