多行和多列的 Where 子句

My2*_*ovE 1 sql-server

我有一个 UDT,它接收 2 个参数,即 ID 和质量

CREATE TYPE [dbo].[ItemUdt] AS TABLE(
[ID] [int] NOT NULL,
[Quality] [int] NULL
)
Run Code Online (Sandbox Code Playgroud)

此 UDT 将用作从表中过滤记录的条件

@ItemList AS ItemUdt READONLY
Run Code Online (Sandbox Code Playgroud)

我想要做的是获取与 ID 和质量都匹配的记录

SELECT * FROM tbl_Item 
WHERE [ID] IN (SELECT ID FROM @ItemList)
AND [Quality] IN (SELECT Quality FROM @ItemList)
Run Code Online (Sandbox Code Playgroud)

但是,上面的查询将匹配包含来自 UDT 的所有质量的所有列出的 ID。例如,如果 UDT 由 (1001, 'Good'), (1002, 'Bad') 组成,则结果将显示所有带有 1001 和 1002 的 ID,以及质量为 'Good' 和 'Bad' 的。但我的预期结果如下:

SELECT * FROM tbl_Item 
WHERE ([ID] = '1001' AND [Quality] = 'Good')
OR ([ID] = '1002' AND [Quality] = 'Bad')
Run Code Online (Sandbox Code Playgroud)

有什么方法可以编写与上述格式匹配的查询?

Mar*_*ith 7

一些 DBMS 允许在IN.

WHERE  (ID, Quality ) IN (SELECT ID, Quality FROM @ItemList) 
Run Code Online (Sandbox Code Playgroud)

SQL Server 不是其中之一,只允许单列。

您可以使用 WHERE EXISTS

SELECT *
FROM   tbl_Item tI
WHERE  EXISTS (SELECT *
               FROM   @ItemList I
               WHERE  I.ID = tI.ID
                      AND I.Quality = tI.Quality) 
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 5

SELECT t.col1, t.col2, etc.
  FROM dbo.tbl_Item AS t
  INNER JOIN @ItemList AS tvp
  ON t.ID = tvp.ID
  AND t.Quality = tvp.Quality;
Run Code Online (Sandbox Code Playgroud)