查询匹配列表 SQL Server 中的所有记录

Posted

技术标签:

【中文标题】查询匹配列表 SQL Server 中的所有记录【英文标题】:Query for match all records in list SQL Server 【发布时间】:2017-10-18 02:45:03 【问题描述】:

我有一个表 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 行,因为任何 bawe 都没有提供 1 服务。我有 0 行。

我使用这个查询

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

提前感谢

【问题讨论】:

显示您的代码。 除了 service=2 和你需要表的哪些列之外,你有多少行?最好是做样品,包括。预期的输出。 我认为 OP 想要显示所有匹配的行,但我们提供的所有服务 ID 都必须存在 service_id。如果我们提供2,3,那么它应该从给定的表中返回所有,当1,2,32,3,4 则没有任何行,因为14 不存在于service_id 列中。 我要求列,因为只返回 bawe_id 而不是完整表(或 rowid)更容易。 没错…… 【参考方案1】:

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

【讨论】:

感谢@Bernd Ott 的明确说明。这对我有帮助,希望它也能帮助其他开发人员。感谢您的努力 +1。【参考方案2】:

试试这个:这真的很乏味但独特的要求,我认为要做到这一点,我们必须使用函数

1-Function 返回 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;

--拆分逗号分隔值并以表格格式返回的功能 --函数复制自 --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, ','))

输出:

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

虽然有点长,但效果很好。

【讨论】:

感谢您的工作,我为您的辛勤工作投了票,但@Bernd Ott 的回答对我有用,我认为这也很简单。【参考方案3】:
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 列表中找到它。

【讨论】:

【参考方案4】:

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

【讨论】:

当提供的服务 ID 不等于 3 或者我的意思是 1,2 or more than that 时,我们是否必须在 having count(distinct bawe_id) = 3 中进行更改?

以上是关于查询匹配列表 SQL Server 中的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

PL SQL 查询以查找与列表中的所有值匹配的标识符列表

如果所有记录都存在于 sql server 的另一个表中,则返回行列表

SQL SERVER代理作业

Sql Server 查询性能

sqlserver中如何写查询语句

两个表查询(SQL 和 ColdFusion)中的匹配值