问题:我试图查看每个 classID 中的员工 (empID) 在 FedCertArea 中是否至少有 1 个 StateCertArea,如果是,则 flag = 1。
这个假案的背景知识:
如果可能的话,我需要避免在 CASE 语句中使用 SELECT。也许使用一些临时表和连接,但我会寻求我能得到的帮助。
DROP TABLE IF EXISTS #temptable
CREATE TABLE #temptable ( ClassID int, EmpID decimal(10,0), StateCertArea varchar(4), FedCertArea varchar(4))
INSERT INTO #temptable (ClassID, EmpID, StateCertArea, FedCertArea)
VALUES
( 572888, 77777, '228', '228'),
( 572888, 77777, '389', '389'),
( 572888, 77777, '374', '374'),
( 222555, 77777, '333', '999')
SELECT t.ClassID
, t.EmpID
, t.StateCertArea
, t.FedCertArea
--, CASE WHEN 'EmployeeID has at least 1 StateCertArea in FedCertArea' THEN 1 ELSE 0 END AS IsInArea
FROM #temptable AS t
预期结果:
outer apply
提供了一种运行相关子查询的有效方法,例如此处所需的子查询:
DROP TABLE IF EXISTS #temptable
CREATE TABLE #temptable (ClassID int, EmpID decimal(10,0), StateCertArea varchar(4), FedCertArea varchar(4))
INSERT INTO #temptable (ClassID, EmpID, StateCertArea, FedCertArea)
VALUES
( 572888, 77777, '228', '228'),
( 572888, 77777, '389', '389'),
( 572888, 77777, '374', '374'),
( 222555, 77777, '333', '999')
SELECT DISTINCT
t.ClassID
, t.EmpID
, CASE WHEN oa.HasMatchingArea = 1 THEN 1 ELSE 0 END AS IsInArea
FROM #temptable AS t
OUTER APPLY (
SELECT TOP 1 1 AS HasMatchingArea
FROM #temptable AS t2
WHERE t2.ClassID = t.ClassID
AND t2.EmpID = t.EmpID
AND t2.StateCertArea = t.FedCertArea
) AS oa
类别ID | EmpID | 在区域内 |
---|---|---|
222555 | 77777 | 0 |
572888 | 77777 | 1 |