2011-04-13 2 views
2

intersect과 같은 결과를 내거나 생성하는 인라인 sql 명령이 있습니까? 그렇지 않으면 쿼리를 다시 작성하여 intersect을 사용하는 대신 하나의 쿼리에 포함시킬 수 있습니까?SQL 인라인 in intersect

SELECT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
    ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
WHERE 
    cs.classselection_link IN (95,1) 

하지만 난 정말 이후 해요 무엇 :

나의 현재 SQL 쿼리는

SELECT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
    ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
WHERE 
    cs.classselection_link = 95 
INTERSECT 
SELECT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
    ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
WHERE 
    cs.classselection_link = 1 

감사

+0

두 번째 쿼리는 실제로 어떤 데이터를 반환합니까? 분명히,'cs.classselection_link'는 1과 95가 될 수 없습니다. 실제로 두 번째 질의에서 요구하는 것이기 때문입니다. –

+0

예, 기본적으로 classValues는 class_link 및 classSelection_link를 보유합니다. 기본적으로 다 대다 관계이고 전달 된 classSelection에 모두 접촉하는 모든 클래스를 원합니다. – lancscoder

+3

왜 'INTERSECT'를 사용하지 않으시겠습니까? 그것은 이유가 있기 때문에 존재하며 그것은 귀하와 같은 경우입니다. 다른 방법으로 쿼리를 작성할 수 있지만 예제에서와 같이 'INTERSECT'를 사용하는 것보다 훨씬 덜 명확합니다. 코드를 난독 화하려는 이유가 있습니까? – JNK

답변

2

당신은 항상 수행 할 수 있습니다

SELECT DISTINCT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv1 ON c.Class_Link = cv1.Class_Link INNER JOIN 
    ClassSelection cs1 ON cv1.ClassSelection_Link = cs1.ClassSelection_Link 

INNER JOIN 
    ClassValues cv2 ON c.Class_Link = cv2.Class_Link INNER JOIN 
    ClassSelection cs2 ON cv2.ClassSelection_Link = cs2.ClassSelection_Link 

WHERE 
    cs1.classselection_link = 95 
    AND 
    cs2.classselection_link = 1 

또는로 GROUP BY :

당신이 정말로 ClassSelection 테이블을 필요로하지 않기 때문에3210
SELECT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
    ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
WHERE 
    cs.classselection_link IN (95,1) 
GROUP BY 
    c.Class_Link 
HAVING 
    COUNT(c.Class_Link) = 2 

가와 : GBN는 지적

SELECT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link 
WHERE 
    cv.ClassSelection_Link IN (95,1) 
GROUP BY 
    c.Class_Link 
HAVING 
    COUNT(c.Class_Link) = 2 

, 나는 (Class_Link, ClassSelection_Link) 테이블 ClassValues에서 UNIQUE 것으로 가정. 사실이 아닌 경우

후, 마지막 두 쿼리의 HAVING 절은 변경되어야합니다

HAVING 
    COUNT(DISTINCT cv.ClassSelection_Link) = 2 
+0

JOIN에서 classselection_link = 95와 함께 3 개의 행이 있다면 어떻게 될까요? 'COUNT (DISTINCT cs.classselection) = 2'이어야합니까? – gbn

+0

@gbn : 네가 맞다.'ClassValues' 테이블에서'(Class_Link, ClassSelection_Link)'가'UNIQUE'라고 가정했다. 어떤 경우에도 수정이 가능합니다. –

1

난 그냥 별개의 원하는 확신 해요. 두 가지 기준 중 어느 하나와 일치하는 고유 한 c.Log_Link 집합을 얻으려고합니다. 맞습니까? 일치하는 경우 :

SELECT DISTINCT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
    ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
WHERE 
    cs.classselection_link IN (95,1) 

편집 : 귀하의 설명을 봅니다. 아마 amit_g가 파생 된 테이블을 제안하는 것이 길일 것이라고 생각합니다.

나는 조금 생각을 조정할 것 :

SELECT 
    c.Log_Link 
FROM 
    Classes c INNER JOIN 
    ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
    ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
    INNER JOIN (
     SELECT 
      c.Log_Link 
     FROM 
      Classes c INNER JOIN 
      ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
      ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
     WHERE 
      cs.classselection_link = 1 
    ) T2 ON c.Log_Link = T2.Log_Link 
WHERE 
    cs.classselection_link = 95 
+0

고맙지 만 별개의 기능이 작동하지 않습니다.DISTINCT가 모든 중복을 제거하는 모든 log_links를 반환하는 반면 95 및 1에 연결된 모든 Log_links를 반환하려고합니다. – lancscoder

2

은 내부 조인 사용 할 수 있습니다 ...

SELECT 
    * 
FROM 
    (
     SELECT 
      c.Log_Link 
     FROM 
      Classes c INNER JOIN 
      ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
      ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
     WHERE 
      cs.classselection_link = 95 
    ) T1 
INNER JOIN 
    (
     SELECT 
      c.Log_Link 
     FROM 
      Classes c INNER JOIN 
      ClassValues cv ON c.Class_Link = cv.Class_Link INNER JOIN 
      ClassSelection cs ON cv.ClassSelection_Link = cs.ClassSelection_Link 
     WHERE 
      cs.classselection_link = 1 
    ) T2 
ON 
    T1.Log_Link = T2.Log_Link 
2

INTERSECT 및 의미 동일 존재한다. 많은 테이블이 필요하지 않습니다.

SELECT 
    c.Log_Link 
FROM 
    Classes c 
WHERE 
    EXISTS (
     SELECT * FROM ClassValues cv 
     WHERE c.Class_Link = cv.Class_Link AND cv.classselection_link = 95) 
AND 
    EXISTS (
     SELECT * FROM ClassValues cv 
     WHERE c.Class_Link = cv.Class_Link AND cv.classselection_link = 1)