选择同一列两次,但条件不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择同一列两次,但条件不同相关的知识,希望对你有一定的参考价值。

我想显示员工的姓名和编号以及老板的编号和姓名,如下所示:

“输出”

只有一张桌子:

“

我到目前为止已经尝试过:

SELECT  
    ID, 
    Name, 
    Boss, 
    (SELECT Name FROM Employees WHERE ID IN (SELECT Boss FROM Employees))
FROM Employees

但是它给我一个错误:

“子查询返回了多个值。当子查询遵循=,!=,,> =或将子查询用作表达式“

答案
您需要自我加入;类似于:

Select a.ID, a.Name, b.ID as Boss, b.Name as BossName from Employees A left join Employees B on a.Boss = b.ID

另一答案
一种方法是限制子查询仅使用TOP子句返回第一个结果。您还需要将其加入主表:

SELECT e.ID, e.Name, e.Boss, (SELECT top 1 Name FROM Employees b where b.ID = e.Boss) as BossName FROM Employees e

另一答案
我实际上必须在我的Azure DB中创建一个类似的拆分。使用标题分隔性别(男人和女人)。

enter image description here

这里是一段代码。

select (Select count(b.TITLE) from SalesLT.Customer b Where Title LIKE 'Mr%') as women ,(Select count(c.TITLE) from SalesLT.Customer c Where Title LIKE 'Ms%') as men ,(Select count(d.TITLE) from SalesLT.Customer d Where Title NOT LIKE 'Ms%' AND Title NOT LIKE 'Mr%' ) as unidentified ,count(a.TITLE) as Total from SalesLT.Customer a

结果:enter image description here
另一答案
APH的答案绝对是最有效的解决方案。但是,我想添加一个具有相关子查询的解决方案,以表明您已经非常接近正在运行的查询。

SELECT E.ID, E.Name, E.Boss, (SELECT Name FROM Employees WHERE ID = E.Boss) AS BossName FROM Employees E

原始查询的问题是子查询中的条件不取决于特定记录。子查询返回每个人的名字,这些人是别人的老板。 

请注意,此解决方案通常比联接具有更差的性能,因为它必须为每个项目执行子查询。尽管结果与连接相当,但许多优化器仍未意识到这一点,因为它们不涉及子查询。

以上是关于选择同一列两次,但条件不同的主要内容,如果未能解决你的问题,请参考以下文章

从同一个表中加入同一列两次时出现模棱两可的错误

如何以不同的条件选择相同的字段两次并将结果显示为单独的字段

条件片段和导航重用

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件

mysql 同一表同一字段满足不同条件的两次求和

按一次返回按钮停留在同一个片段上,如果按两次,它将返回到上一个片段