T-SQL中带有AND的WHERE IN子句



我正试图从我的表中匹配T-SQL中的数据;IN with AND";条款除了举个例子之外,我想不出该如何描述这一点。。。

这是我的数据表。。。

tbl_值

pkId nv_Name nv_Values
1 测试1 1.1,2.1,3.1
2 测试2 1.2,2.1,3.1
3 测试3 1.1,2.2,3.1

要检查给定vmv.fk_MatchValueId是否有不存在于#TblValues表中的匹配值,可以添加:

AND NOT EXISTS (
SELECT * FROM [tbl_MatchValues] t 
LEFT JOIN #TblValues ON #TblValues.[Number] = t.nv_MatchValue
WHERE t.pkId = vmv.fk_MatchValueId
AND #TblValues.[Number] IS NULL)

如果你更喜欢它,你可以把";左联接"以及";IS NULL";检查";NOT IN(…(";。没有时间创建表并对查询进行实时测试,但主体可以工作。如果有大量的数据,你可能想考虑一个不同的模型,因为";不存在";在这些情况下可能会耗费时间。

以下ROW_NUMBER()方法适用于有限的样本集。如果您的数据或匹配条件比显示的更复杂,您的结果可能会有所不同。

编辑:添加了一个带有CSV值的CROSS JOIN,以便根据需要将它们放入最终的SELECT中。

DECLARE @t_val TABLE (pkId INT, nv_Name VARCHAR(10), nv_Values VARCHAR(30))
INSERT INTO @t_val
VALUES
(1, 'test1', '1.1,2.1,3.1'),
(2, 'test2', '1.2,2.1,3.1'),
(3, 'test3', '1.1,2.2,3.1')
DECLARE @t_Match TABLE (pkId INT, nv_MatchValue VARCHAR(30))
INSERT INTO @t_Match
VALUES
(1, '1.1'),
(2, '1.2'),
(3, '1.3'),
(4, '2.1'),
(5, '2.2'),
(6, '2.3'),
(7, '3.1'),
(8, '3.2'),
(9, '3.3')
DECLARE @t_val_Match TABLE (pkId INT, fk_t_val INT, fk_t_Match INT)
INSERT INTO @t_val_Match
VALUES
(1, 1,  1),
(2, 1,  4),
(3, 1,  7),
(4, 2,  2),
(5, 2,  4),
(6, 2,  7),
(7, 3,  1),
(8, 3,  5),
(9, 3,  7)
DECLARE @CSV TABLE (Number VARCHAR(MAX))
INSERT INTO @CSV
VALUES
('1.1'),
('3.1')
;WITH CTE
AS
(
SELECT val.[nv_Name]
,val.[nv_Values]
,mv.nv_MatchValue -- JUST FOR DEMONSTRATION
,ROW_NUMBER() OVER(PARTITION BY val.[nv_Name] ORDER BY val.[nv_Name]) AS NumMatches
FROM @t_val AS val
JOIN @t_val_Match AS vmv ON vmv.fk_t_val = val.pkId
JOIN @t_Match AS mv ON vmv.fk_t_Match = mv.pkId
WHERE mv.nv_MatchValue IN (SELECT Number FROM @CSV)
)
SELECT c.nv_Name
, c.nv_Values 
, v.Number
FROM CTE c
CROSS JOIN @CSV v
GROUP BY nv_Name, nv_Values, v.Number
HAVING MAX(NumMatches) = (SELECT COUNT(*) FROM @CSV)
编号<1.1>
nv_Namenv_Values
测试11.1,2.1,3.11.1
测试11.1,2.1,3.13.1
测试31.1,2.2,3.1
测试31.1,2.2,3.13.1

最新更新