2011-10-23 79 views
-1

我需要根據另一個表上存在的兩列排除數據。排除記錄

表1有2列a和b。 表2有3列a,b,c。 B欄和C欄代表range.for一些記錄我們沒有範圍。示例如下。

表2的數據,

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 

我們需要根據表2的數據,以排除從表1中的記錄。 table1.column A = table2.column A和table1.column b在tabl2.column b和table2.column之間c。

表1有數百條記錄,但我們需要從table1數據中排除table2數據。在表1中給出了下面的示例數據。

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

我們需要從表中排除1日的記錄和第五記錄2.

請幫我在儘快解決這個問題?

+4

尋求幫助「儘快」通常對SO有相反的效果。 – Tony

+0

'Table2.ColumnC'中的'NULL'代表什麼?沒有上限?這同樣適用於'ColumnB'(即沒有下限)嗎? – Phil

+0

@Tony:時間想起「ALAP」;-) – zerkms

回答

1

我假設Column BColumn C中的NULLTable2中分別代表範圍沒有下限或上限。

試試這個

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意味着範圍是開放式的。

隨着所有這些被說,你的問題的答案可以通過使用連接最容易回答。如果這是您的一個新概念,您可能需要查看關於關係數據庫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

感謝這一點。我需要排除不同原因的記錄(無空),我認爲你的答案可能適用於我。我試圖避免舊的SELECT * FROM TABLE WHERE FIELD NOT IN(SELECT FIELD FROM TABLE) – DataGirl