SQL - 如何查找相关行?即,如果存在具有 X 值的行,是否存在另一行具有 Y 值的行?

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

在 SQL 中,我有一张打卡表,显示当天谁在各自的轮班中打卡上班,以及谁在当天的轮班中打卡下班。每个打卡上班的人都应该打卡下班,但我们遇到了一个问题,人们打卡上班却忘记了打卡下班。我想编写一个查询,检查签到的人是否没有签下,并返回所有忘记签下的人的列表,以及他们最后一个打卡的人。我不想制作一个表格来跟踪谁应该打卡上班和下班,因为有人可能会错过一天,或者休假一天等 - 但他们都知道打卡上班,所以我想我可以我的检查以此为基础。一些示例数据如下:

DECLARE @PunchCards TABLE
(
    [Name] VARCHAR(20),
    [Shift] VARCHAR(30)
);
--John & Kate have clocked in & out properly, Doug forgot to clock out
INSERT INTO @PunchCards
    (Name, Shift)
VALUES
    ('John',           -- Name - varchar(20)
     'Start Day Shift' -- Shift - varchar(30)
    ),
    ('Doug',           -- Name - varchar(20)
     'Start Day Shift' -- Shift - varchar(30)
    ),
    ('John',         -- Name - varchar(20)
     'End Day Shift' -- Shift - varchar(30)
    ),
    ('Kate',             -- Name - varchar(20)
     'Start Night Shift' -- Shift - varchar(30)
    ),
    ('Kate',           -- Name - varchar(20)
     'End Night Shift' -- Shift - varchar(30)
    )

根据该数据,我的查询应该返回一行 - Name = Doug,Shift = Start Day Shift。

我对如何解决这个问题感到困惑 - 我的工作想法是使用 CASE WHEN 并在 case 语句中执行子查询,将我当前的 SELECT 与子查询进行比较,看看我当前的班次是否为“开始日”轮班”或“开始夜班”,以确保无论是哪一个,都有其各自的“结束日班”或“结束夜班”。即便如此,我仍然在思考如何分解这个问题来解决它。我对如何解决这个问题有什么想法吗?谢谢。

sql case
1个回答
0
投票

您可以使用

not exists
子句来表示没有结束班次:

select  Name
from    @PunchCards pc1
where   shift like 'Start % Shift'
        and not exists
        (
        select  *
        from    @PunchCards pc2
        on      pc1.name = pc2.name
                and pc2.shift like replace(pc1.shift, 'Start', 'End')
        )
© www.soinside.com 2019 - 2024. All rights reserved.