通过查询结果获取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
)
此外,我还有两个tableBooks
和Authors
:
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
) 是 Hamlet
和 Romeo and Juliet
的作者)。 1
是 Author
的 idAuthor
我想找到原因 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;
我有一个存储过程,它有两个参数 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
)
此外,我还有两个tableBooks
和Authors
:
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
) 是 Hamlet
和 Romeo and Juliet
的作者)。 1
是 Author
的 idAuthor
我想找到原因 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;