2

この質問はすでに行われている可能性がありますが、答えが見つからないようです。

JOIN2つのテーブルのから10個のフィールドを選択しています。結果は約1186行のデータです。これらの行では、1つの一意のフィールド()を除いて、すべての目的と目的でいくつかが重複していますClassId。このフィールドが必要ですが、それは私が「ユニーク」と定義したものを取得するのを妨げています。たとえば、、、のみをクエリするCodeTeacherDescripTerm1120レコードが生成されます。

WHERE私はこれと同じクエリを実行したいと思っていましたが、「重複」の原因となっている一意のフィールドを除外する、より狭いフィールドのセット(正確には上記の3つ)を検索するサブクエリを含む句を追加しました。もちろん、私が受け取ったエラーは以下のとおりです。

「サブクエリがEXISTSで導入されていない場合、選択リストで指定できる式は1つだけです。」

EXISTS代わりに使用しようとしたとき、ClassScedule.Code IN私はまだ完全な1186を取り戻しました。

これが私の質問です:

 SELECT DISTINCT ClassId
      ,Code
      ,Section
      ,Course
      ,Students
      ,ClassStart
      ,TeacherDescrip
      ,AdTeacherID
      ,email
      ,Term
      ,Campus
  FROM ClassScedule
  JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
  WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
        AND ClassScedule.Code IN 
              (SELECT DISTINCT ClassScedule.Code, TeacherDescrip, Termcode 
               FROM ClassScedule 
              WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30')
        AND TeacherDescrip IS NOT NULL 
  ORDER BY Instructor
4

4 に答える 4

1

SQL Server 2005 以降を使用している場合は、次のように、個別 (Code、TeacherDescrip、Term) ごとに 1 つの結果を選択できます。

SELECT TOP (1) WITH TIES
       ClassId
      ,Code
      ,Section
      ,Course
      ,Students
      ,ClassStart
      ,TeacherDescrip
      ,AdTeacherID
      ,email
      ,Term
      ,Campus
  FROM ClassScedule
  JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
  WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
  AND TeacherDescrip IS NOT NULL 
  ORDER BY ROW_NUMBER() OVER (
    PARTITION BY Code, TeacherDescrip, Term
    ORDER BY ClassID DESC
  )

重複する (Code、TeacherDescrip、Term) 値の中で、このクエリは ClassID が最小の結果を返します。代わりに最大にしたい場合は、DESC を削除してください。

于 2012-04-04T16:31:43.143 に答える
0

さて、汚い解決策は次のとおりです。

 SELECT max(ClassId),
      ,Code ,Section ,Course ,Students ,ClassStart ,TeacherDescrip ,AdTeacherID
      ,email ,Term ,Campus
  FROM ClassScedule
  JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
  WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
    AND TeacherDescrip IS NOT NULL 
  GROUP BY Code ,Section ,Course ,Students ,ClassStart ,TeacherDescrip
   ,AdTeacherID ,email ,Term ,Campus
  ORDER BY Instructor

これにより、「重複」値の最大 ClassId が取得されます。サブクエリは実際にはこれらの日付の間にあるすべてのクラス コードを取得しているように見えますが、外側のクエリはすでにそれらのクラス コードをすべて取得しているため、必要ありません。

于 2012-04-04T16:15:59.823 に答える
0

まず、サブクエリで複数の列を返して WHERE 句で比較を行うことはできません

              ClassScedule.Code IN 
              (SELECT DISTINCT ClassScedule.Code, TeacherDescrip, Termcode 
               FROM ClassScedule 
              WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30')

メインの WHERE からすでに取得しているため、とにかく役に立ちませんclause

テーブルにはClassId「一意」と定義したものが複数あるため、複数の行が返されないようにする唯一の方法はClassIdSELECT. そうしないと、SQL Server はどちらが必要かを知る方法がありClassIdません。

1 つだけが必要な場合は、 orと group を他のすべてにClassId使用できます。MINMAX ClassId

于 2012-04-04T16:16:24.993 に答える
0

次の方法で大きなグループにします。

SELECT DISTINCT
      min(ClassId) ClassId
     ,Code
     ,Section
     ,Course 
     ,Students
     ,ClassStart
     ,TeacherDescrip
     ,AdTeacherID
     ,email
     ,Term
     ,Campus
FROM ClassScedule
JOIN staff ON staff.StaffID = ClassScedule.AdTeacherID
WHERE ClassStart BETWEEN '2012-03-01' AND '2012-03-30'
  AND TeacherDescrip IS NOT NULL
GROUP BY
      Code
     ,Section
     ,Course 
     ,Students
     ,ClassStart
     ,TeacherDescrip
     ,AdTeacherID
     ,email
     ,Term
     ,Campus
ORDER BY Instructor

サブクエリは必要ありません。列を少し調整する必要がある場合があります。テーブルのエイリアスがないと、それらがどのテーブルから来たのかを知ることができません。「最初の」ClassId を選択しますが、max() を使用して「最後の」ClassId を引き出すことができます。

于 2012-04-04T16:18:54.600 に答える