如果您使用的是 SQL Server 2014,则很容易创建您自己的拆分函数。我使用的是以下(但你可以谷歌搜索更有效的其他人,特别是如果你的名单很长):
create FUNCTION [dbo].[fnSplit](
@sDelimiter VARCHAR(5) -- delimiter that separates items
, @sInputList VARCHAR(max) -- List of delimited items
) RETURNS @List TABLE (item VARCHAR(max))
BEGIN
DECLARE @sItem VARCHAR(max)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
然后,您将能够通过以下方式实现您想要的:
declare @demo table (SupplierID int, InventoryOfSentoID int)
declare @list varchar(10) = '2,3'
declare @ids table (SentoID int)
declare @cnt int
INSERT INTO @demo VALUES (1,1),(1,2),(2,5),(3,3),(3,2),(3,1)
INSERT INTO @ids
SELECT * FROM dbo.fnSplit(',',@list)
SELECT @cnt = COUNT(*) FROM @ids
SELECT SupplierID FROM @demo d
INNER JOIN @ids i
ON i.SentoID = d.InventoryOfSentoID
GROUP BY SupplierID
HAVING COUNT(*) = @cnt
作为解释,请注意HAVING
限制的使用。这是为了确保只返回提供列表中所有元素的那些供应商。如果您没有此限制,则结果集将包含供应商 ID 1,从您的问题中我假设您想排除该 ID。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句