问题:
我想基于“异常表”中当前分配的“优先级”返回“主数据”表中的所有行以及“最高优先级异常”。
我在下面(使用创建脚本)创建了数据设置的简化示例,因此希望您可以帮助解决相当快速的T-SQL问题。
设置:
我有一个主数据表,其中每一行可以有一个或多个作为位掩码存储的异常。
CREATE TABLE [dbo].[PrimaryData](
Id [INT] IDENTITY(1,1) NOT NULL,
SomeData [VARCHAR](30) NOT NULL,
Exceptions [INT] NOT NULL,
)
INSERT INTO [dbo].[PrimaryData](SomeData, Exceptions)
VALUES('Data A', 0)
INSERT INTO [dbo].[PrimaryData](SomeData, Exceptions)
VALUES('Data B', 6)
INSERT INTO [dbo].[PrimaryData](SomeData, Exceptions)
VALUES('Data C', 6)
INSERT INTO [dbo].[PrimaryData](SomeData, Exceptions)
VALUES('Data D', 192)
INSERT INTO [dbo].[PrimaryData](SomeData, Exceptions)
VALUES('Data E', 132)
完全将异常存储在查找表中是因为每个异常都被赋予了用户分配的优先级。最终用户不能在此表中添加或删除行,它们只能控制每个异常的优先级,最高为1。
CREATE TABLE [dbo].[Exception](
Id [INT] IDENTITY(1,1) NOT NULL,
Priority [INT] NOT NULL,
Mask [SMALLINT] NOT NULL,
Description [VARCHAR](30) NOT NULL
)
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(1, 1, 'Exception A')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(2, 2, 'Exception B')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(3, 4, 'Exception C')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(4, 8, 'Exception D')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(5, 16, 'Exception E')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(6, 32, 'Exception F')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(7, 64, 'Exception G')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(8, 128, 'Exception H')
INSERT INTO [dbo].[Exception] (Priority, Mask, Description)
VALUES(9, 256, 'Exception I')
因此,基于提供的样本数据,我想返回SomeData,Mask(具有最高优先级)和Description(具有最高优先级)。
即
| Data B | 2 | Exception B
显然,我需要以最有效的方式执行此操作,因为主数据表中可能会返回25K行。
提前致谢。
最佳答案
SELECT *
FROM PrimaryData pd
CROSS APPLY
(
SELECT TOP 1 *
FROM Exception e
WHERE e.Mask & pd.Exceptions <> 0
ORDER BY
e.Priority
) q
关于sql-server - SQL Server-使用按位运算符查找最高优先级项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2347446/