排除记录

时间:2011-10-23 22:46:06

标签: sql

我需要根据另一个表中的两列来排除数据。

表1有2列a和b。 表2有3列a,b,c。列B和C表示范围。对于某些记录,我们没有范围。例子如下。

表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和table 1.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

我们需要从表2中排除第一条记录和第五条记录。

请尽快帮我解决这个问题?

2 个答案:

答案 0 :(得分:1)

我假设NULL中的Column BColumn C中的Table2分别表示该范围没有下限或上限。

试试这个

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 :(得分: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,您可以避免需要为每一行重新发出查询,并且应该获得稍微更好的性能。如果你只有几百行,虽然这不应该产生太大的差别。