2011-11-11 3 views
3
Student Table 

SID Name 
1  A 
2  B 
3  C 

Marks Table 

id mark subject 
1 50 physics 
2 40 biology 
1 50 chemistry 
3 30 mathematics 



SELECT distinct(std.id),std.name,m.mark, row_number() over() as rownum FROM 

student std JOIN marks m ON std.id=m.id AND m.mark=50 

이 결과는 disticnt를 사용한 후에도 2 배가됩니다. 내 예상 결과는 하나만 A. rownum로 잘 작동으로 row_number() over() 제거하면됩니다. 왜 이런 일이 일어나는거야? 해결 방법. DB2를 사용하는 AM !!중복을 피하는 방법 두 테이블 합치기

+0

물리학 및 화학 분야에서 A 마크를 사용하지 않으려면 학생과 마크에 합류해야합니다. – sceaj

+0

나는 적어도 하나의 주제가 적어도 50 인 학생을 원한다. – zod

답변

5

id = 1 및 mark = 50 인 표가있는 두 행이 있습니다. 학생 표의 각 행에 대해 두 행을 출력합니다 ... 하나만 원한다면 나는 적어도 하나 개의 주제에 (50)의 표시가 모든 학생들을 찾으려면

: 당신이 질문을 명확히했습니다 이제

SELECT std.id, std.name, m.mark, row_number() 
    over() as rownum 
FROM student std 
    JOIN marks m 
     ON m.id=std.id AND m.mark=50 
Group By std.id, std.name, m.mark 
+0

결합에 술어를 절대 (거의) 넣지 마라 !!! – orbfish

+1

항상 조인 술어를 조인에 넣습니다. where 절 술어는 전체 결과 세트가 생성 될 때까지 평가되지 않으므로 불필요한 행이 처리 중에 전달되고 특정 외부 조인 시나리오에서는 where 절에 술어를 넣으면 잘못된 결과가 생성됩니다. 마지막으로 조인에 조인 술어를 넣으면 끝에있는 모든 테이블이 아닌 테이블 근처에 조인됩니다. 그러면 쿼리가 명확 해집니다. –

+0

또한, 때때로 각 조인에 대해 DIFFERENT 술어를 사용하여 동일한 테이블에 두 번 이상 조인하려고합니다. Where 절에서 어떻게 할 것입니까? –

3

하여 그룹. 쿼리를 사용합니다.

SELECT student.id, '50' 
FROM student 
WHERE EXISTS (SELECT 1 FROM marks WHERE marks.id = student.id AND marks.mark = 50) 

이렇게하면 다음과 같은 기준을 유연하게 변경할 수 있습니다. 적어도 하나의 마크로 50 이하.

+0

+1 EXISTS (세미 조인)가 실제로하고 싶은 것입니다. 추가 데이터가 모두 필요하지 않기 때문에 전체 조인이 필요하지 않습니다. 이 쿼리는 전체 조인의 추가 작업을 수행하는 것보다 훨씬 효율적입니다. 그리고 데이터 세트를 처음부터 원하는 것만으로 트리밍하기 위해 더 많은 추가 작업을 수행하십시오. –

+0

+1은 어디에서나 사용할 수 있지만, 그의 rownum 열에 대해서는 잊어 버렸습니다. – orbfish

+0

@orbfish 나는 OP가'row_number() over()'로 무엇을하려하는지 정말로 이해하지 못한다. @ zod 아마도 당신은 명확하게 할 수 있습니까? – sceaj

1

찰스 답장과 비슷하지만 항상 WHERE 절에 술어 (mark = 50)를 넣으므로 조인하기 전에 필터링해야합니다. 이것이 숙제 일 경우 중요하지 않을 수 있습니다. 그러나 실제 데이터를 쳤다면 이것을 기억하고 싶을 것입니다.

SELECT std.sid, 
     std.name, 
     m.mark, 
     row_number() over() AS rownum 
FROM student std 
     JOIN marks m 
     ON std.sid=m.id 
WHERE m.mark=50 
GROUP BY std.sid, std.name, m.mark 
+0

대부분의 쿼리 최적화 프로그램은 절 배치에 관계없이 필터를 적용하기에 가장 좋은 시간을 알아낼 수 있습니다. 이게 DB2의 특질인가요? –

+0

@M_M - 아니요 - (적어도 iSeries에서) DB2는 동일한 Explain 플랜을 생성하는 것으로 보이며 두 쿼리를 동일한 액세스 경로를 사용하여 동일하게 간주합니다. 최소한 이것과 같은 단순한 예제들. @All -'WHERE' 절 대'JOIN' 절의 조건 설정은 항상 동일한 결과를 반환하지 않습니다 (이것은 LEFT 및/또는 EXCEPTION 조인을 사용할 때 주로 적합합니다). 따라서 조건은 성능상의 이유가 아닌 올바른 결과를 생성합니다 (DB2 옵티마이 저는 매우 우수합니다). –

+0

@M_M - 오라클에 익숙합니다. 때로는 알아낼 수도 있지만 때로는 SQL로 말한 것을 실제로 의미하는 것으로 나타납니다. – orbfish

관련 문제