0

結果の行を返す SELECT でサブクエリを作成できますか?

たとえば、次のようなクエリを使用する必要があります。

SELECT columnA as aliasA, columnB as aliasB,
(SELECT columnC FROM table2
WHERE clause2) as aliasC,
(SELECT  columnD FROM table2
WHERE clause2) as  aliasD
FROM table1
WHERE clause1

実行に時間がかかりすぎるため、改善したいと思います。次のようなクエリを作成する方法はありますか?

SELECT columnA as aliasA, columnB as aliasB,
(SELECT columnC, columnD FROM table2
WHERE clause2) as (aliasC, aliasD)
FROM table1
WHERE clause1

ありがとう

注 : より具体的に言うと、例を挙げます。第 1 四半期の各月の学生の最高の結果と最悪の結果を取得する必要があります。テーブルに参加すると、同じ学生に対して複数の行が表示されます (各月に 1 行)。ただし、次のものが必要です。

SELECT firstname, lastname, 
(SELECT MAX(value) FROM results WHERE results.student_id = student.id AND results.date
BETWEEN 'JAN-01' AND 'JAN-31') AS best_result_of_jan,
(SELECT MIN(value) FROM results WHERE results.student_id = student.id AND results.date
BETWEEN 'JAN-01' AND 'JAN-31') AS worst_result_of_jan,
 ..., 
(SELECT MIN(value) FROM results WHERE results.student_id = student.id 
AND results.date BETWEEN 'MAR-01' AND 'MAR-31') AS worst_result_of_mar 
FROM student 
WHERE student.has_maths = 1
4

3 に答える 3

3

編集

SELECT s.firstname, s.lastname,
       t.best_result_of_jan, t.worst_result_of_mar
FROM student s 
LEFT JOIN (
    (SELECT student_id,
            MAX(CASE WHEN results.date BETWEEN 'JAN-01' AND 'JAN-31'
                     THEN value ELSE NULL END) best_result_of_jan,
            MIN(CASE WHEN results.date BETWEEN 'MAR-01' AND 'MAR-31'
                     THEN value ELSE NULL END) worst_result_of_mar
     FROM results
     GROUP BY student_id
    ) t ON t.student_id = s.id
WHERE s.has_maths = 1

サブクエリは、学生ごとに必要な列にデータをピボットします。次に、外側のクエリによって、これらの列が Student テーブルの列に追加されます。


まず、元のクエリは、サブクエリがスカラー結果を返す場合、つまり単一行またはなしの場合にのみ機能します。これにより、LEFT JOIN 形式に安全に変換できます。結果として、単一行 (デカルト積なし) または行なし (fizzed join) になることもあります。

   SELECT a.columnA as aliasA, a.columnB as aliasB,
          b.columnC as aliasC, b.columnD as aliasD
     FROM table1 a
LEFT JOIN table2 b ON clause2
    WHERE clause1;

句 1 と 2 で列にエイリアスを設定してください。

注: このようなクエリの計画では、table2 が 1 回処理され、columnC/D が解決されます。元のクエリでは、サブクエリの行ごとの実行が発生し、2 回起動するため、パフォーマンスが低下する可能性があります。

于 2013-04-17T13:48:49.823 に答える
2

次のような結合が必要です。

SELECT table1.columnA as aliasA, table1.columnB as aliasB, 
       table2.columnC as aliasC,
       table2.columnD as aliasD
FROM table1 left outer join
     table2
     on clause2
WHERE clause1
于 2013-04-17T13:48:20.730 に答える