私は単純な2つの列テーブルを持っています。たとえば、次のデータを使用してデータを構築することができます。SQLで重複するサブクエリーを避ける最適な方法
CREATE TABLE Duplicates
(assignmentid varchar(5), questionid varchar(5));
INSERT INTO Duplicates
(assignmentid, questionid)
VALUES
('aaaaa', '11111'),
('aaaaa', '22222'),
('bbbbb', '22222'),
('bbbbb', '33333'),
('bbbbb', '33333');
同じ2つの行があります。複数の割り当てに表示される質問もあります。後者は有効なシナリオです。複数の課題の一部であるすべての質問のクエリを取得しようとしています。だから私の所望の出力は次のようになります。
aaaaa, 22222
bbbbb, 22222
私はこれを取得することができた。この結果を:
SELECT main.questionid, sub.assignmentid
FROM (
SELECT questionid, count(assignmentid) AS AssignmentCount
FROM (
SELECT DISTINCT questionid, assignmentid
FROM Duplicates
) sub
GROUP BY questionid
HAVING AssignmentCount > 1
) main
INNER JOIN (
SELECT DISTINCT questionid, assignmentid
FROM Duplicates
) sub ON main.questionid = sub.questionid;
あなたはDISTINCTサブクエリは二回繰り返されている見ることができるように。私はWITHコマンドを使用してこれを避けることができますが、これは必ずしもサブクエリが一度だけ実行されるというわけではありません。だから、今私はStackOverflowで、誰かがこのクエリを実行するためのより効率的な方法を知っているかどうか尋ねる。
CTE(with)クエリ**は一度実行されます**。 –
@a_horse_with_no_name CTEのコメントを拡大してください。私は、CTEをビュー(一時表と比較して)として扱うべきだと考えました。つまり、ビューが使用されるたびに、呼び出しが基礎となる表に繰り返されます。おそらく私は誤解したでしょう。ここで私が参照した別のstackoverflowページへのリンクです: –
Kumar