2017-05-18 164 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奧特的答案爲我工作,我認爲這很簡單。 –

相關問題