SQL Server:如何从另一个表的列的行中减去一列的行

时间:2016-05-16 12:39:11

标签: sql-server

我有两张桌子A和B:

  • A有id,ColumnA
  • B有id,ColumnB

看起来像:

id  ColumnA
-----------
1   A1
5   A5
7   A7

B看起来像:

id  ColumnB
-----------
1   B1
3   B3
5   B5
8   B8

我想要像表B那样的结果,即(id,ColumnB)应该是表B中但不在表A中的值。

因此,结果应如下所示:

Id  ColumnB
-----------
3   B3
8   B8

我怎样才能有效地做到这一点?

我尝试使用左连接和内连接然后减去但我认为它可以以更好的方式完成..建议?

5 个答案:

答案 0 :(得分:3)

使用NOT EXISTS执行此操作

select id, ColumnB 
from tableB B
where not exists (select 1 from tableA A where B.Id = A.Id)

答案 1 :(得分:3)

使用NOT EXISTS谓词

SELECT * FROM B WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.ID = B.ID)

答案 2 :(得分:2)

SELECT * 
FROM B 
WHERE id NOT IN (SELECT ID FROM A)

查看您描述的两个表,id似乎在两个表中都不可为空,因此上述查询将起作用。但是,在子查询可能返回IN值的情况下,您应该谨慎使用NULL

答案 3 :(得分:1)

如果使用左连接,则可以过滤掉where子句中表A中的值,即

task getDistributionValues {
    fileTree(dir: 'build/tmp/distribution/', include: '*.zip').visit { FileVisitDetails details ->
        distributionZips << details.file.name
        println('printvalues'+distributionZips)
    }
}

getDistributionValues.dependsOn(getDistribution)
def distributionComponentName

task unzipDistribution(type:Copy){
    distributionZips.each { unzipNames ->
        distributionComponentName = unzipNames.substring(0,unzipNames.length()-15)
        println('comp Name here'+distributionComponentName)
        def zipFile = file('build/tmp/distribution/'+unzipNames)
        into project.buildDir
        from(zipTree(zipFile)) {
            into 'tmp/unzipComponent/'+distributionComponentName
       }
    }
}
unzipDistribution.dependsOn(getDistributionValues)

答案 4 :(得分:0)

Select * From B
    Where Not Exists (Select null From A Where A.ID = B.ID)