我正试图从我的表中匹配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)
nv_Name | nv_Values | 编号|
---|---|---|
测试1 | 1.1,2.1,3.1 | 1.1 |
测试1 | 1.1,2.1,3.1 | 3.1 |
测试3 | 1.1,2.2,3.1 | <1.1>|
测试3 | 1.1,2.2,3.1 | 3.1 |