2016-10-02 11 views
0

woldが以下に示す結合クエリと同じ結果を達成するサブクエリを作成しようとしています。結合クエリをサブクエリに変換する

SELECT Department_to_major.DNAME 
FROM Department_to_major 
INNER JOIN Course 
ON Department_to_major.Dcode = Course.OFFERING_DEPT 
WHERE Course.COURSE_NAME LIKE '%INTRO%' 
GROUP BY Department_to_major.DNAME 

ただし、それぞれの試みによってエラーが発生しました。

これをサブクエリとして書く方法はありますか?

+1

なぜですか?サブクエリははるかに効率的ではありません – andrew

答えて

0

次のクエリを試してください。私はあなたがDNAMEフィールドを一意にするために "GROUP BY"節を使用したと仮定しています。

SELECT DISTINCT(DNAME) 
FROM Department_to_major 
WHERE Dcode IN (SELECT OFFERING_DEPT 
      FROM Course 
      WHERE COURSE_NAME LIKE '%INTRO%'); 
+0

はい、GROUP BY句を追加する前の最初のクエリでは、同じDepartment名の複数の行が表示されます。 – DSQLJ

1


こんにちは、あなたは、クエリの下に使用することができます

SELECT DNAME FROM Department_to_major WHERE 
Dcode IN (SELECT OFFERING_DEPT FROM Course 
WHERE COURSE_NAME LIKE '%INTRO%') 

あなたは、GROUP BY句を使用していますが、クエリ内の任意の集約関数なしではありません。クエリは正常に動作していますか?ここで

+0

クエリは、私が期待していた/期待していた結果を生成しています。つまり、イントロコースを持っているすべての部門名を一覧表示する。 – DSQLJ

1

は、サブクエリを使用する方法です:

SELECT DISTINCT dm.DNAME 
FROM Department_to_major dm 
WHERE EXISTS (SELECT 1 
       FROM Course c 
       WHERE dm.Dcode = c.OFFERING_DEPT AND 
        c.COURSE_NAME LIKE '%INTRO%' 
      ); 

私はGROUP BYは、出力の重複を防ぐためであると仮定します。 SELECT DISTINCTも同じことをします。

つまり、部門コードの名前をDepartment_to_majorに格納することは、部門名が(おそらく)複数回繰り返されるため、適切なデータ構造ではありません。私はあなたが1台の部門あたり1行のDepartmentsテーブルを持つことを期待しています。

その後のクエリは次のようになります。

SELECT d.DNAME 
FROM Departments d 
WHERE EXISTS (SELECT 1 
       FROM Course c 
       WHERE d.Dcode = c.OFFERING_DEPT AND 
        c.COURSE_NAME LIKE '%INTRO%' 
      ); 

そしてSELECT DISTINCT/GROUP BYは不要です。

+0

フィードバックいただきありがとうございます。あなたは正しいです、部署のための別のテーブルがあります。クエリは問題なく動作します。 – DSQLJ

関連する問題