Sql 通过比较查询结果查找id
我有一个表变量名,其中包含以下数据:Sql 通过比较查询结果查找id,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表变量名,其中包含以下数据: SELECT * FROM Names 其结果是: Name ----- Jon Adam Ben Joseph 此外,还有一个函数fn_GetNamesById@Id它通过id1获取名称: 其结果将是: Name ----- Jon Adam Ben Joseph Name ----- Adam Jon Joseph Ben Name ----- Marc William Gordon Wiktor Felix 另一个id2将返回另一个结
SELECT * FROM Names
其结果是:
Name
-----
Jon
Adam
Ben
Joseph
此外,还有一个函数fn_GetNamesById@Id它通过id1获取名称:
其结果将是:
Name
-----
Jon
Adam
Ben
Joseph
Name
-----
Adam
Jon
Joseph
Ben
Name
-----
Marc
William
Gordon
Wiktor
Felix
另一个id2将返回另一个结果
SELECT * FROM fn_GetColumns(2)
其结果将是:
Name
-----
Jon
Adam
Ben
Joseph
Name
-----
Adam
Jon
Joseph
Ben
Name
-----
Marc
William
Gordon
Wiktor
Felix
另一个id3将返回另一个结果:
SELECT * FROM fn_GetColumns(3)
其结果将是:
Name
-----
Jon
Adam
Ben
Joseph
Name
-----
Adam
Jon
Joseph
Ben
Name
-----
Marc
William
Gordon
Wiktor
Felix
我想要的是在名为find的UDF/存储过程中查找id_ID@IDs,@Names,将表变量名的结果与函数fn_GetColumnsid的结果进行比较
存储过程/UDF的参数为:
为此,我编写了一个存储过程Find_ID,它在遍历ID时包含一个循环。当前id将放入函数fn_GetColumnsid中,然后将fn_GetColumnsid的结果与结果表变量@Names进行比较
但是,如果查询结果相同,我不知道如何比较两个查询结果并获得当前id:
-- My stored procedure
CREATE PROCEDURE [Find_ID] (
@IDs [UWQ].[TY_MyType] READONLY,
@Names [UWQ].[TY_MyNames] READONLY
DECLARE @IDs TABLE(ID uniqueidentifier)
DECLARE @Names TABLE(ID uniqueidentifier)
DECLARE @Processed INT
DECLARE @COUNTER INT = 0;
DECLARE @MAX INT = (SELECT COUNT(*) FROM @IDs)
DECLARE @VALUE VARCHAR(50);
--loop:
WHILE @COUNTER < @MAX
BEGIN
--we are iterating through id = 1, 2, 3
SET @VALUE = (SELECT ID FROM
(SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) [index] ,
ID from @IDs) R
ORDER BY R.[index] OFFSET @COUNTER
ROWS FETCH NEXT 1 ROWS ONLY);
// pseudo code: if SELECT * FROM fn_GetColumns(1) is equal to SELECT *
// FROM Names THEN return @VALUE
// pseudo code: else iterate to find id
// pseudo code: if there is no names then return NULL
SET @COUNTER = @COUNTER + 1
END
输出:1-as UDF fn_GetColumns1返回相同的查询结果
与从名称中选择*类似,假设名称不同,您可以执行以下操作:
SELECT (CASE WHEN COUNT(*) = nn.cnt THEN 1 ELSE 0 END) as all_same
FROM Names n JOIN
fn_GetColumns(@id) gc(name)
ON n.name = gc.name CROSS JOIN
(SELECT COUNT(*) as cnt FROM names) nn;
这将计算匹配数并将其与名称总数进行比较。我意识到我可以只计算EXCEPT运算符的查询结果。如果唯一行的计数为0,则表示找到了必要的ID:
SELECT
@DesiredID = count(1)
FROM
(
SELECT * FROM (SELECT * FROM @Names) InputNames
EXCEPT
SELECT * FROM (SELECT TOP 1000 Name
FROM fn_GetColumns(@VALUE) ORDER BY ColumnOrder) DesiredNames
) rn
IF @DesiredID = 0
BEGIN
PRINT @DesiredID
PRINT @VALUE
BREAK
END
整个代码如下所示:
DECLARE @IDs TABLE(ID uniqueidentifier)
DECLARE @Processed INT
INSERT INTO @IDs
SELECT
f.ID
FROM Fields f
GROUP BY f.ID
DECLARE @Names TABLE
(
Name varchar(50)
)
INSERT INTO @Names
VALUES
('Jon'), ('Adam'), ('Ben'), ('Joseph')
DECLARE @COUNTER INT = 0;
DECLARE @MAX INT = (SELECT COUNT(*) FROM @IDs)
DECLARE @VALUE VARCHAR(50);
DECLARE @DesiredID VARCHAR(50);
WHILE @COUNTER < @MAX
BEGIN
SET @VALUE = (SELECT ID FROM
(SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) [index] , ID from @IDs) R
ORDER BY R.[index] OFFSET @COUNTER
ROWS FETCH NEXT 1 ROWS ONLY);
--PRINT @VALUE
SELECT
@DesiredID = count(1)
FROM
(
SELECT * FROM (SELECT * FROM @Names) InputNames
EXCEPT
SELECT * FROM (SELECT TOP 1000 Name
FROM fn_GetColumns(@VALUE) ORDER BY ColumnOrder) DesiredNames
) rn
IF @DesiredID = 0
BEGIN
PRINT @DesiredID
PRINT @VALUE
BREAK
END
SET @COUNTER = @COUNTER + 1
END
非常感谢您的回复!我已将您的查询放入伪代码部分,并得到以下错误:无效的对象名称“fn_GetColumns”。还有一个问题,我怎么知道你的身份?你认为这些名字是什么意思different@StepUp . . . fn_getcolumns是你的语法,不是我的。SQL Server至少需要UDF的架构。对于不同的名称,这意味着它们对于每个结果集都是唯一的。