CREATE TABLE dbo.Person(
PersonID INT IDENTITY(1,1) PRIMARY KEY,
FullName NVARCHAR(100) NOT NULL,
Col1 INT NOT NULL,
WorkGroupId TINYINT NOT NULL,
RoleId TINYINT NOT NULL,
[Priority] AS CONVERT(TINYINT,
CASE
WHEN WorkGroupId=2 THEN 1 -- Priority 1
WHEN RoleId=2 THEN 2 -- Priority 2
ELSE 3 -- Priority 3
END)
);
GO
-- http://technet.microsoft.com/en-us/library/ms189292.aspx
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_NULLS ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET QUOTED_IDENTIFIER ON;
GO
CREATE INDEX IX_Person_Col1_Priority
ON dbo.Person (Col1,[Priority])
INCLUDE (FullName);
GO
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'A' ,1,1,1);
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'BB' ,1,0,1);
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'CCC' ,1,2,1); -- <--
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'DDDD',1,0,0);
GO
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'X' ,2,1,1);
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'YY' ,2,1,2); -- <--
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'ZZZ',2,1,3);
GO
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'?' ,3,1,1);
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'!!' ,3,2,1); -- <--
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'%%%' ,3,1,2);
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'&&&&',3,1,3);
GO
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'-' ,4,1,1); -- No result
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'--' ,4,1,1); -- No result
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'---' ,4,1,1); -- No result
INSERT dbo.Person (FullName,Col1,WorkGroupId,RoleId) VALUES (N'----',4,1,1); -- No result
GO
SELECT *
FROM(
SELECT p.PersonID,p.FullName,
-- If you have many persons with the same priority then you should use DENSE_RANK
ROW_NUMBER() OVER (ORDER BY p.[Priority]) AS Rnk
FROM dbo.Person p
WHERE p.Col1=1
AND p.[Priority] IN (1,2)
) x
WHERE x.Rnk=1;
SELECT *
FROM(
SELECT p.PersonID,p.FullName,
-- If you have many persons with the same priority then you should use DENSE_RANK
ROW_NUMBER() OVER (ORDER BY p.[Priority]) AS Rnk
FROM dbo.Person p
WHERE p.Col1=2
AND p.[Priority] IN (1,2)
) x
WHERE x.Rnk=1;
SELECT *
FROM(
SELECT p.PersonID,p.FullName,
-- If you have many persons with the same priority then you should use DENSE_RANK
ROW_NUMBER() OVER (ORDER BY p.[Priority]) AS Rnk
FROM dbo.Person p
WHERE p.Col1=3
AND p.[Priority] IN (1,2)
) x
WHERE x.Rnk=1;
SELECT *
FROM(
SELECT p.PersonID,p.FullName,
-- If you have many persons with the same priority then you should use DENSE_RANK
ROW_NUMBER() OVER (ORDER BY p.[Priority]) AS Rnk
FROM dbo.Person p
WHERE p.Col1=4
AND p.[Priority] IN (1,2)
) x
WHERE x.Rnk=1;
Результаты:
PersonID FullName Rnk
-------- -------- ---
3 CCC 1
PersonID FullName Rnk
-------- -------- ---
6 YY 1
PersonID FullName Rnk
-------- -------- ---
9 !! 1
PersonID FullName Rnk
-------- -------- ---
И план выполнения последние четыре отчета:
Примечание: Col1
представляет собой испытательный номер.
Вы хотите, чтобы всегда возвращалась одна строка? Что делать, если два человека соответствуют этим критериям, или один человек находится в WorkGroupId = 2, а другой человек находится в RoleId = 2? Можете ли вы показать образцы данных, желаемые результаты и остальную часть запроса? Возможно, вы заметили, что получаете кучу плохих ответов - это хотя бы частично, потому что ваши требования очень неясны. –
Извините, мне просто нужен первый человек, у которого есть рабочая группа из 2 ... если нет никого, тогда я хочу первый с помощью роли 2 ... так что только один человек вернулся – Bobcat88
Можете ли вы пояснить, что в вопросе, пожалуйста? –