Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何制作一个;“两个相关参数”;SQL存储过程_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 如何制作一个;“两个相关参数”;SQL存储过程

Sql server 如何制作一个;“两个相关参数”;SQL存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,我就是搞不懂,我所说的两个依赖参数是: 假设我有这样的记录: 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,因为它是唯一一个符合所

我就是搞不懂,我所说的两个依赖参数是:

假设我有这样的记录:

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,因为它是唯一一个符合所有这些条件的ID:

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

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

参见:代码>81:A- 1 < /代码>,代码> 81:B-2 < /代码>,如果使用不同,查询认为81有“代码> A、1、B、2 < /代码>,但返回的只有23,因为它有<代码> A1、A2、B1、B2< /代码> @ AntoinePelletier,您试过运行联机演示吗?它只输出23。@AntoinePelletier,
具有
条件确保所有参数都得到满足think@AntoinePelletier,明白了。请参阅更新的答案和演示。参见:<代码> 81:A- 1 < /代码>,代码> 81:B-2 < /代码>,如果使用不同,查询认为81有“代码> A、1、B、2 < /代码>,但返回的只有23,因为它有<代码> A1、A2、B1、B2 < /代码> @ AntoinePelletier,您试过运行联机演示吗?它只输出23。@AntoinePelletier,
具有
条件确保所有参数都得到满足think@AntoinePelletier,明白了。请参阅更新的答案和演示。