SQL删除并过滤类似的结果

SQL删除并过滤类似的结果,sql,sql-server,Sql,Sql Server,我有下面的查询,它给了我一个订单列表,其中一个地址出现两次,因此我们可以将相同的订单双重打包到相同的地址 select * from Orders where address in (select address from orders group by address having count(*) = 2) CustID StockID Address Company -----------------------------------

我有下面的查询,它给了我一个订单列表,其中一个地址出现两次,因此我们可以将相同的订单双重打包到相同的地址

select * from Orders
where 
address in (select address from orders group by address having count(*) = 2)




CustID     StockID      Address             Company 
-----------------------------------------------------------------
1217        23185       1 Some Road         Stockton            
58458       23185       1 Some Road                     
58459       23185       4 John St                       
58457       23185       4 John St                       
299576      23185       9 Roadway PDE       Graceland           
59470       23185       9 Roadway PDE       Cahill Tow          
97656       23185       24 Kent St                      
97677       23185       24 Kent St                      
212732      23185       23 Best Rd                      
226583      23185       23 Best Rd          c/o John            
191718      23185       98 King St                      
156363      23185       98 King St                      
121106      23185       19 Broadway                     
156362      23185       19 Broadway             
我希望结果是这样的,它不包括任何出现的地址,这些地址在出现的两个结果中都有一个公司名称。有些地址在公司名称中没有任何内容,但是如果同一地址的其他结果包含公司名称,则我也要将其排除在外

CustID     StockID      Address             Company 
-----------------------------------------------------------------
58459       23185       4 John St                       
58457       23185       4 John St                       
97656       23185       24 Kent St                      
97677       23185       24 Kent St                      
191718      23185       98 King St                      
156363      23185       98 King St                      
121106      23185       19 Broadway                     
156362      23185       19 Broadway             
希望这一切都有意义,并感谢任何帮助

谢谢大家!

从订单o1中选择* 哪里 0=从订单o2中选择计数* 其中o1.address=o2.address 公司不是空的
这是一个相关子查询,它通过地址将主查询和子查询联系在一起。我假设空公司是NULL,如果不使用空值,则替换为.< /P> < P>作为@ CordWork MUSE在评论中提到,在这个场景中有很多事情需要考虑,涉及到数据清洁和业务逻辑。话虽如此,您可以针对您的问题尝试以下方法:

;with filtered as
(
select * from Orders
where 
address in (select address from orders group by address having count(*) = 2)
)
,cte as
(select address, max(company) as max
from filtered
group by address
having max(company) = '')
select f.* from filtered f
inner join cte c on f.address = c.address

基本上,您可以创建一个CTE来标识那些只有空值的公司,然后返回查询结果

您可能需要在子查询中添加WHERE子句。注意,除非你做了某种形式的地址规范化,否则同一地址的不同形式可能会通过ie,N.E.vs NE,AVE vs AVE等。我也可能会添加一个过滤器,仅在客户相同的情况下才这样做-宿舍、共享住房等的情况如何?正是我试图解决的问题,我只想删除包含同样属于同一地址的公司的任何行。因此,如果有意义的话,共享宿舍也可以包含在公司名称中。谢谢@Turophile我认为这是正确的查询,并提供了我需要的结果。我需要做的唯一一件事是用company替换company不为null,它提供了我需要的。非常感谢。还有没有一种方法可以将它与我原来的count=2的查询连接起来?或者我只能使用临时数据库来执行此操作?您所说的加入查询是什么意思?请用一个清晰的句子来表达,比如:同一地址有多个订单的所有行,并且地址的任何一行上都没有公司,不用担心..所以我的初始查询是select*from Orders,其中地址在select address from Orders group by address中,count*=2,我如何使用子查询将其全部设置为一询问?其实没必要,我设法弄明白了。再次感谢@turphilithaks的回答@shree.pat18,但这给了我低于预期的结果,感谢turphile的查询,它返回了正确数量的结果。