Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 通过比较查询结果查找id_Sql_Sql Server_Tsql - Fatal编程技术网

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的架构。对于不同的名称,这意味着它们对于每个结果集都是唯一的。