通过查询结果获取ID

Get ID by query result

我有一个存储过程,它有两个参数 user-defined table type:

ALTER PROCEDURE MyProcedure
  @ReceivedBooks tp_Books READONLY,
  @ReceivedIdAuthors tp_Authors READONLY,
AS

用户自定义table类型的结构如下所示:

CREATE TYPE [dbo].[tp_Books] AS TABLE(
    [BookName] [VARCHAR](50) NULL
)

CREATE TYPE [dbo].[tp_Authors] AS TABLE(
    [AuthorIds] [VARCHAR](50) NULL
)

此外,我还有两个tableBooksAuthors:

Books:

----------------------------------------------------------------
|      ID      |    Name                    |      Id_Author   |
----------------------------------------------------------------
|       1      |     Hamlet                 |        1         | 
|       2      |     Spartaco               |        2         | 
|      10      |     Romeo and Juliet       |        1         | 
|      11      |     Great Expectations     |        3         | 
|      12      |     Pride and Prejudice    |        5         | 
|      13      |     A Tale of Two cities   |        3         | 
----------------------------------------------------------------

Authors:

---------------------------------------------
|      ID      |    Name                    | 
---------------------------------------------
|       1      |     William Shakespeare    | 
|       2      |     Raffaello Giovagnoli   | 
|       3      |     Charles Dickens        | 
|       5      |     Jane Austin            |     
---------------------------------------------

例如,我在我的存储过程中收到具有以下值的 @ReceivedBooks@idAuthors

 'Hamlet', 'Romeo and Juliet' --@ReceivedBooks
 1, 2, 3, 5                   --@ReceivedIdAuthors

那么我就可以知道1就是我要找的Id_Author。如以下 EXCEPT 语句 returns IdAuthor = 1 没有行(William Shakespeare(ID=1) 是 HamletRomeo and Juliet 的作者)。 1AuthoridAuthor 我想找到原因 EXCEPT 语句 returns 没有行:

SELECT * FROM @ReceivedBooks
EXCEPT 
SELECT Name FROM #Books WHERE IdAuthor IN (1)        

让我举个例子,其中 EXCEPT 语句 returns 行。因此,这个Id_Author不是我想要的。

SELECT * FROM @ReceivedBooks
EXCEPT 
SELECT Name FROM #Books WHERE IdAuthor IN (2) -- 3, 5

所以我的目标是在@ReceivedIdAuthors中找到必要的id_author

我怎样才能做到这一点?

基本上,你想return第一个元组(人,部门)的人不包括在@List中?

@List 有多大?如果 is 相当小,您可以使用:

SELECT dep.Name, 
       pr.ID
FROM dbo.Person AS pr
 INNER JOIN dbo.Department AS dep ON dep.ID = pr.id_Person
WHERE id_Person = @personId
 AND id_Person NOT IN @List
LIMIT 1;

此外,我认为您不需要迭代查询,至少没有给出我在您的问题描述中可以看到的数据。

根据额外的说明评论,您似乎真正需要的是:

  • 查找您@ReceivedBooks参数中的所有书籍是否属于同一作者,并且
  • 通讯作者是否也出现在@ReceivedIdAuthors参数中。

这里使用的技术叫做relational division:

select b.Id_Author
from @ReceivedBooks rb
  inner join dbo.Books b on b.Name = rb.BookName
where exists (
  select 0 from @ReceivedIdAuthors ra
  where ra.AuthorId = b.Id_Author
)
group by b.Id_Author
having count(distinct b.Id_Author) = 1;