2011-10-23 4 views
-1

다른 테이블에있는 두 개의 열을 기반으로 데이터를 제외해야합니다.레코드 제외

표 1에는 a 및 b 열이 2 개 있습니다. 표 2에는 a, b, c 세 개의 열이 있습니다. 열 B와 C는 범위를 나타냅니다. 일부 레코드의 경우 범위가 없습니다. 아래 주어진 예.

표 2 데이터, 우리는 테이블이 데이터를 기반으로 표 1에서 레코드를 제외해야

Column A Column B Column C 
1   1   10 
2   5   NULL 
2   8   NULL 
2   25   50 
3   10   100 
4   7   10 
4   2   NULL 

. table1.column A = table2.column A 및 tabl2.column b와 table2.column 사이의 1.column b. c.

표 1에는 수백 개의 레코드가 있지만 table1 데이터에서 table2 데이터를 제외해야합니다. 아래 테이블 1 샘플 데이터.

ColumnA Column B 
1  4 
1  14 
1  15 
2  1 
2  5 

우리는 2

최대한 빨리이 문제를 해결 도와주세요 테이블에서 첫번째 기록, 5 기록을 제외해야?

+4

도움말 요청 "최대한 빨리"일반적으로 SO에 반대 효과가 있습니다. – Tony

+0

'Table2.ColumnC'에서'NULL'은 무엇을 나타내는가? 상한 없음? 'ColumnB'에도 동일한 내용이 적용됩니까 (즉, 하한이 없음)? – Phil

+0

@ 토니 : "ALAP"을 생각할 시간 ;-) – zerkms

답변

1

Column B 또는 Column CTable2에있는 NULL이 범위의 상한 또는 상한을 각각 상정한다고 가정합니다.

는 유능 그래서 앞까지 내 가정 사항을 나열합니다 그것을 대답하기 위해이 질문에서 누락 필요한 많은 정보가있다이

SELECT ColumnA, ColumnB 
FROM Table1 
WHERE NOT EXISTS (
    SELECT 1 FROM Table2 
    WHERE Table1.ColumnA = Table2.ColumnA 
    AND ((
     Table2.ColumnC IS NULL 
     AND Table1.ColumnB >= Table2.ColumnB 
    ) OR (
     Table2.ColumnB IS NULL 
     AND Table1.ColumnB <= Table2.ColumnC 
    ) OR (
     Table1.ColumnB BETWEEN Table2.ColumnB AND Table2.ColumnC 
    )) 
) 
1

을보십시오. 앞으로는 사용중인 SQL 벤더를 추가하고 데이터의 의미가 도움이 될 것입니다.

여러분이 MSSQL 2008 R2를 사용 중이며, 표 2의 데이터가 표 1의 값이 떨어지지 않아야하는 일련의 제외 범위를 나타내며 NULL 값이 열 C는 범위가 개방형임을 의미합니다.

귀하의 질문에 대한 답변은 조인을 사용하여 가장 쉽게 답변 할 수 있습니다. 이것이 새로운 개념이라면 관계형 DB에있는 조인 (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)과 특정 RDBMS에 대한 JOIN 문서를 검토 할 수 있습니다.

MSSQL에서 다음과 같은 작업을 수행하여이 작업을 수행 할 것입니다 :

With ValuesInRange 
AS 
(
    Select distinct ColumnA, ColumnB from Table1 
    Join Table2 on Table1.A = Table2.A 
    AND Table1.ColumnB >= Table2.ColumnA 
    AND Table1.ColumnB <= isnull(Table2.ColumnC, Table1.ColumnB) 
) 
Select * from Table1 a 
OUTER Join ValuesInRange b 
ON a.ColumnA = b.ColumnA AND a.ColumnB = b.ColumnB 
Where b.ColumnA IS NULL 

당신이 모든 행에 대한 쿼리를 다시 실행 할 필요 방지하고 소폭 더 나은 성능을 얻을해야 CTE를 사용하여. 너무 많은 차이를 만들어서는 안되지만 수백 개의 행만 있으면됩니다.

+0

감사합니다. 다른 이유 (No Nulls)로 레코드를 제외해야하며 귀하의 대답이 저에게 효과적 일 수 있다고 생각합니다. 이전 SELECT * FROM TABLE을 피하려고했습니다. FIELD NOT IN (SELECT FIELD TABLE) – DataGirl