如何制作"两个依赖参数"SQL 存储过程



我只是无法弄清楚,我的意思是两个因子参数是:

假设我有这样的记录:

ID    Letter     Number
-----------------------
23    A          1
23    A          2
23    B          1
23    B          2
81    A          1
81    B          2

用户将输入以下内容:

  • 第一个参数: A,B
  • 第二个参数: 1,2

然后只返回ID 23,因为这是唯一尊重所有这些条件的人:

A1,A2,B1,B2

每次我尝试查询时,返回81 ...

在我的问题的背景下,要制作4个条件,例如:

A and 1, A and 2, B and 1, B and 2

但是想象一下我有16 * 16 ...

写所有这些都非常长...

您可以在HAVING子句中使用COUNT DISTINCT

SELECT Id
FROM #Tbl
WHERE
    Letter IN('A', 'B')
    AND Number IN(1, 2)
GROUP BY Id
HAVING
    COUNT(DISTINCT Letter) = 2
    AND COUNT(DISTINCT Number) = 2;

对于更动态的方法,您可以将标准列入表变量:

DECLARE @Letters TABLE(Letter CHAR(1));
DECLARE @Numbers TABLE(Number INT);
INSERT INTO @Letters VALUES ('A'), ('B');
INSERT INTO @Numbers VALUES (1), (2);
WITH CteCross(Letter, Number) AS(
    SELECT Letter, Number 
        FROM @Letters
        CROSS JOIN @Numbers
)
SELECT t.Id
FROM #Tbl t
INNER JOIN CteCross cc
    ON cc.Letter = t.Letter
    AND cc.Number = t.Number
GROUP BY t.Id
HAVING COUNT(*) = (SELECT COUNT(*) FROM CteCross);

在线演示

最新更新