将连接查询转换为子查询

时间:2016-10-02 14:29:33

标签: mysql sql subquery inner-join

我试图编写一个子查询,该查询将获得与下面显示的连接查询相同的结果。

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

但是每次尝试都会产生错误。

有没有办法把它写成子查询?

3 个答案:

答案 0 :(得分:1)

嗨,您可以使用以下查询,

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

您已使用GROUP BY子句,但查询中没有任何聚合函数。您的查询是否正常?

答案 1 :(得分:1)

这是一种使用子查询的方法:

summing:  [4 5 6]
15
summing:  [1 2 3]
6

我认为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是不必要的。

答案 2 :(得分:0)

尝试以下查询。我假设你已经使用了" GROUP BY"使DNAME领域独一无二的条款。

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