我有一个 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)
有什么方法可以编写与上述格式匹配的查询?
一些 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)
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)
| 归档时间: |
|
| 查看次数: |
5608 次 |
| 最近记录: |