0

次のクエリをMicrosoftSQLServerに書き込む方がよいのではないかと思います。

、、の3つのテーブルsurveyssurvey_presetsありsurvey_scenesます。次の列があります。

CREATE TABLE [dbo].[surveys](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [caption] [nvarchar](255) NOT NULL,
    [creation_time] [datetime] NOT NULL,
)
CREATE TABLE [dbo].[survey_presets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [survey_id] [int] NOT NULL,
    [preset_id] [int] NOT NULL,
)
CREATE TABLE [dbo].[survey_scenes](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [survey_id] [int] NOT NULL,
    [scene_id] [int] NOT NULL,
)

両方ともsurvey_presets、列のsurvey_scenes外部キーがオンsurveysになっていsurvey_idます。

次に、対応するプリセットとシーンの数をそれぞれに含むすべての調査を選択します。これが私が欲しいものの「疑似クエリ」です:

SELECT
    surveys.*,
    COUNT(survey_presets, where survey_presets.survey_id = surveys.id), 
    COUNT(survey_scenes, where survey_scenes.survey_id = surveys.id)
FROM surveys
ORDER BY suverys.creation_time

SELECT DISTINCT、、などJOINをいじることはできますが、GROUP BYT-SQLは初めてであり、クエリがどのような意味でも最適になるとは思えません。

4

2 に答える 2

2

デカルト積を避けるために、サブクエリでカウントを行います。いくつかの一致する行がpresetsあり、scenes結果としていくつかの行が乗算される可能性があるためです。distinct survey_presets.id単純な結合クエリを作成し、 andを数えることで乗算を回避できdistinct survey_scenes.idます。

SELECT
    surveys.*,
    isnull(presets_count, 0) presets_count,
    isnull(scenes_count, 0) scenes_count
FROM surveys
LEFT JOIN 
(
  SELECT survey_id,
         count(*) presets_count
    FROM survey_presets
   GROUP BY survey_id
) presets
  ON surveys.id = presets.survey_id
LEFT JOIN 
(
  SELECT survey_id,
         count(*) scenes_count
    FROM survey_scenes
   GROUP BY survey_id
) scenes
  ON surveys.id = scenes.survey_id
ORDER BY surveys.creation_time

使い方

derived tableクエリの FROM セクションに呼び出される特別な種類のサブクエリを導入できます。派生テーブルは、括弧で囲まれた通常のクエリとして定義され、その後にテーブル エイリアスが続きます。外部クエリの列を使用することはできませんが、ON セクションで使用する列を公開して、派生テーブルをクエリの本体に結合できます。

この場合、派生テーブルは単に ID でグループ化された行をカウントします。ジョインはカウントをアンケートに接続します。

于 2012-09-19T11:52:07.770 に答える
0
SELECT surveys.ID, surveys.caption, surveys.creation_time,
count(survey_presets.survey_id) as survey_presets,
count(survey_scenes.survey_id)  as survey_scenes
FROM surveys
LEFT OUTER JOIN survey_presets on survey_presets.survey_id = surveys.id 
LEFT OUTER JOIN survey_scenes  on survey_scenes.survey_id  = surveys.id
GROUP BY surveys.ID, surveys.caption, surveys.creation_time
ORDER BY suverys.creation_time
于 2012-09-19T11:50:13.760 に答える