如何比较多行中的多条记录是否具有相同的ID?

问题描述 投票:0回答:1

问题:我试图查看每个 classID 中的员工 (empID) 在 FedCertArea 中是否至少有 1 个 StateCertArea,如果是,则 flag = 1。

这个假案的背景知识:

  • 所有 classID 都有 FederalCertAreas
  • 所有员工都有 StateCertAreas
  • 我正在尝试查看员工是否拥有与 ClassID 的任何 FedCertArea 相匹配的 StateCertArea。

如果可能的话,我需要避免在 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

预期结果:

sql sql-server tsql sql-server-2019
1个回答
0
投票

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.