2016-02-13 109 views
1
WHERE 
    E.CNO IN 
    (
    SELECT 
     CNO 
    FROM 
     COURSE 
    WHERE 
     LOWER(CNAME) LIKE LOWER('%WORLD%') 
    AND 
     LOWER(CNAME) LIKE LOWER('%HISTORY%') 
    ) 
AND 
    C.DNAME IN 
    (
    SELECT 
     DNAME 
    FROM 
     COURSE 
    WHERE 
     LOWER(CNAME) LIKE LOWER('%WORLD%') 
    AND 
     LOWER(CNAME) LIKE LOWER('%HISTORY%') 
    ); 

这给了我正在寻找的结果,但我有点强迫症,并希望能够缩短这个如果可能的话。贝娄是我想要做的,但我不确定运营商是否会工作。将两个IN语句合并为一个子句?

WHERE 
    E.CNO, C.DNAME IN 
    (
    SELECT 
     CNO, 
     DNAME 
    FROM 
     COURSE 
    WHERE 
     LOWER(CNAME) LIKE LOWER('%WORLD%') 
    AND 
     LOWER(CNAME) LIKE LOWER('%HISTORY%') 
    ); 

回答

2

某些数据库支持in子句中的多个列。但是,您可能会发现可以使用join或使用exists来重写它。下面是一个例子与exists

where exists (
    select 1 
    from course 
    where e.cno = course.cno and 
      c.dname = course.dname and 
      lower(c.cname) like lower('%WORLD%') and 
      lower(c.cname) like lower('%HISTORY%') 
) 

或者你可以使用一个join

join course on c.dname = course.dname and 
      e.cno = course.cno and 
      lower(c.cname) like lower('%WORLD%') and 
      lower(c.cname) like lower('%HISTORY%') 

无需子查询那里。

+0

谢谢!真的喜欢加入代码的流程。 – defaultNINJA

相关问题