【问题标题】:SQL select row if column equal to row如果列等于行,SQL 选择行
【发布时间】:2019-12-09 22:43:01
【问题描述】:

我得到了这张桌子:

| NINumber  | fname | lname   | mentored_by |
---------------------------------------------
| DD1199XYZ | John  | Smith   | DD234CD1X   |
| DD0094CYY | Barry | Gibbson | DD0094CYY   |
| DD234CD1X | Mike  | Hammer  | NULL        |
| AB2323CYA | Peter | Falk    | NULL        |

基本上,我试图找到不受任何人指导但对某人来说是指导的人。并显示他们的 NINumber、名字和姓氏的首字母。

例如,我应该从我的桌子上找人:

| DD234CD1X | Mike  | Hammer  | NULL        |

这是我迄今为止尝试过的:

SELECT NINumber, SUBSTRING(fname, 1, 1) AS init, lname 
FROM Hospital_Doctor
WHERE NINumber IN (
 SELECT NINumber 
 FROM Hospital_Doctor 
 where IFNULL(mentored_by, 'NULL') = 'NULL' 
)

这基本上显示了不受任何人指导的人,但我不知道我应该如何表明一个人也是导师。

【问题讨论】:

    标签: mysql sql database row multiple-columns


    【解决方案1】:

    您可以将exists 与相关子查询一起使用:

    select t.*
    from Hospital_Doctor t
    where 
        t.mentored_by is null
        and exists (
            select 1 from Hospital_Doctor t1 where t1.mentored_by = t.NINumber
        )
    

    Demo on DB Fiddle

    NI号码 |名称 |姓名 |指导者 :-------- | :---- | :----- | :---------- DD234CD1X |迈克 |锤子 |

    【讨论】:

    • “select 1”实际上是做什么的,它有效,但我只是想了解为什么
    • @NikuNik:exists 条件的目的是检查子查询是否返回something。所以基本上子查询的结果被丢弃了,因此select 1
    【解决方案2】:

    虽然您可以使用exists,但INNER JOIN 会更快

    select d.NINumber, SUBSTRING(d.fname, 1, 1) AS init, d.lname
    from Hospital_Doctor d
    inner join Hospital_Doctor md on md.mentored_by = d.NINumber
    where d.mentored_by is null;
    

    【讨论】:

    • 如果一个人没有导师但导师不止一个人,这会产生重复的行。
    • 同意重复行,完全不同意@danblack。内连接也在此处进行过滤,如果您删除它,您将失去此过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多