我需要根据另一个表中的两列来排除数据。
表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中排除第一条记录和第五条记录。
请尽快帮我解决这个问题?
答案 0 :(得分:1)
我假设NULL
中的Column B
或Column 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,您可以避免需要为每一行重新发出查询,并且应该获得稍微更好的性能。如果你只有几百行,虽然这不应该产生太大的差别。