2017-05-18 127 views
0

我有一个表bawe_services。我想获取给定键查询匹配列表中的所有记录SQL Server

像我有场

id | Service_id |bawe_id 
1  2   2 
2  3   3 
3  2   3 

如果我通过相匹配的所有数据服务= 2我需要的service_id = 2,如果我通过服务= 1,2,3的所有记录比我想要0行,因为1服务不是由任何bawe给出。我有0行。

我用这个查询

select * from aspnet_bawe_services where ser_id in(1,2,3) 

Thanx提前查询

+2

显示您的代码。 – DigiFriend

+0

您在服务= 2时除外的行数以及您需要的表格列数?最好,如果你做样品包括。预期的产出。 –

+1

我想OP想要显示所有匹配的行,但是对于我们提供的所有服务ID,“service_id”必须存在。如果我们提供'2,3',那么它应该从给定的表中返回全部,当'1,2,3'或'2,3,4'时没有任何行,因为'1'或'4'不存在于'service_id'列。 – Susang

回答

2

参数的数量在“in”语句必须具有相等数量相匹配。

select bawe_id from [dbo].[aspnet_bawe_services] 
where Service_id in (2) 
group by bawe_id 
having count(Service_id)=1; 

bawe_id 
----------- 
2 
3 

select bawe_id from [dbo].[aspnet_bawe_services] 
where Service_id in (2,3) 
group by bawe_id 
having count(Service_id)=2; 

bawe_id 
----------- 
3 

select bawe_id from [dbo].[aspnet_bawe_services] 
where Service_id in (1,2,3) 
group by bawe_id 
having count(Service_id)=3; 

bawe_id 
----------- 

(0 row(s) affected) 
+0

Thanx @Bernd Ott明确的规范。这个帮助我希望它也能帮助其他开发者。感谢你的努力+1。 –

0
select * from aspnet_bawe_services 
where Service_id in (1,2,3) 
and 
(select count(distinct Service_id) from aspnet_bawe_services where Service_id in (1,2,3)) = 3 

最后一个号码(在这种情况下, “3”)是元素计数,你有IN列表。

0

你可以得到你想要使用group byhaving服务ID:

select service_id 
from t 
where bawe_id in (1, 2, 3) 
group by service_id 
having count(distinct bawe_id) = 3; 

的“= 3”是IN列表ID的数量。

然后可以使用injoinexists得到完整的记录:

select t.* 
from t 
where t.service_id in (select service_id 
         from t 
         where bawe_id in (1, 2, 3) 
         group by service_id 
         having count(distinct bawe_id) = 3 
        ); 
+0

当提供的service id完全不等于'3'或者我的意思是'1,2或者更多'时,我们是否需要修改'having count(distinct bawe_id)= 3'? – Susang

+0

没有得到你在这里做的 –

1

试试这个:这真的很乏味,但唯一的要求,我认为要做到这一点,我们必须使用功能

1,函数返回的service_id

2功能于重复计数分割逗号分隔值并以表格格式返回

- 功能返回明显计数的service_id

CREATE FUNCTION [dbo].[getCount](@service_id varchar(500)) 
RETURNS INT    
AS  
BEGIN 
    DECLARE @count int 

    SELECT @count = COUNT(DISTINCT(t.service_id)) 
    FROM tmptos t 
    INNER JOIN [dbo].[SplitValue](@service_id, ',') tt on t.service_id = tt.items 

RETURN @count 
END; 

--Function分裂逗号分隔值并返回以表格的形式从 复制 --Function - separate comma separated values and store in table in sql server

CREATE FUNCTION [dbo].[SplitValue](@String varchar(MAX), @Delimiter char(1))  
RETURNS @temptable TABLE (items VARCHAR(MAX))  
AS  
BEGIN  
    DECLARE @idx int  
    DECLARE @slice varchar(8000)  

    SELECT @idx = 1  
     if len(@String)<1 or @String is null return  

    WHILE @idx!= 0  
    BEGIN  
     set @idx = charindex(@Delimiter,@String)  
     IF @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     IF(LEN(@slice)>0) 
      INSERT INTO @temptable(Items) values(@slice)  

     SET @String = right(@String,len(@String) - @idx)  
     IF LEN(@String) = 0 break  
    END 
RETURN 
END; 

--Table with Sample Data 

create table tmptos(id int, Service_id int, bawe_id int) 
insert into tmptos values 
(1,  2,   2), 
(2,  3,   3), 
(3,  2,   3) 


declare @service_id varchar(50) = '2,3' 

select * 
from tmptos t 
inner join [dbo].[SplitValue](@service_id, ',') tt on t.Service_id = tt.items 
where [dbo].[getCount](@service_id) = (select count(distinct(items)) from [dbo].[SplitValue](@service_id, ',')) 

OUTPUT:

id Service_id bawe_id items 
1 2   2  2 
2 3   3  3 
3 2   3  2 

这是有点冗长,但工作完美。

+0

感谢你的工作,我投你的辛勤工作,但@Bernd奥特的答案为我工作,我认为这很简单。 –

相关问题