2016-10-02 58 views
0

我正在嘗試編寫一個子查詢來完成與下面顯示的加入查詢相同的結果。將加入查詢轉換爲子查詢

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

請嘗試以下查詢。我假設你已經使用「GROUP BY」子句來使DNAME字段獨一無二。

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

是的,在添加GROUP BY子句之前的第一個查詢中,會出現多行顯示相同部門名稱的行。 – 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部門代碼名字是不是一個很好的數據結構,因爲該部門的名字是(大概)重複多次。我希望你只有一個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