簡體   English   中英

查詢匹配列表SQL Server中的所有記錄

[英]Query for match all records in list SQL Server

我有一張表bawe_services。 我想獲取與給定鍵匹配的所有數據

就像我有田野

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

如果我通過service = 2我需要通過service = id,2的所有記錄,如果我通過service = 1,2,3而不是我想要0行,因為1條服務都沒有得到任何授權。 我有0行。

我用這個查詢

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

提前感謝

“ 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)

嘗試一下:這確實很乏味,但要求獨特,我認為要實現這一點,我們必須使用功能

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;

-分割逗號分隔值並以表格式返回的函數-從以下位置復制的函數- 分隔逗號分隔值並存儲在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

它有點長,但是效果很好。

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列表中。

您可以使用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的數量。

然后in您可以使用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
                      );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM