代码之家  ›  专栏  ›  技术社区  ›  StepUp

按查询结果获取ID

  •  0
  • StepUp  · 技术社区  · 8 年前

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

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

    自定义表类型的结构如下所示:

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

    此外,我还有两张桌子 Books Authors :

    :

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

    作者 :

    ---------------------------------------------
    |      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 语句不返回 IdAuthor = 1 (威廉·莎士比亚( ID=1 )是的作者 Hamlet Romeo and Juliet ). 和 1. idAuthor 属于 Author 我想找到原因 除非 语句不返回任何行:

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

    让我举个例子,其中 除非 语句返回行。因此 Id\u作者 这不是我想要的。

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

    所以我的目标是找到必要的 id_author 在里面 @ReceivedIdAuthors .

    我怎样才能做到这一点?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Roger Wolf    8 年前

    根据其他澄清意见,您真正需要的似乎是:

    • 查找您的 @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;
    
        2
  •  1
  •   9DA    8 年前

    基本上,您希望返回(person,department)的第一个元组,其中该人员未包含在@列表中?

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

    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;
    

    此外,我认为您不需要迭代查询,至少不需要提供我在问题描述中看到的数据。