SQL JOIN - 选择非不同行的值

Posted

技术标签:

【中文标题】SQL JOIN - 选择非不同行的值【英文标题】:SQL JOIN - Select values to non distinct rows 【发布时间】:2020-11-12 22:06:09 【问题描述】:

这很难解释,但我正在对 2 个表进行内部连接,其中第 2 个表中的值正在创建新行,而不是将值添加到同一行,而是将值添加到列中。

所以,我的结果如下所示:

 Employee 1 | Supervisor 1
 Employee 1 | Supervisor 2
 Employee 1 | Supervisor 3

我想要的结果是这样的

Employee 1 | Supervisor 1 | Supervisor 2 | Supervisor 3`

这样我可以将我的WHERE 子句表述得更具体一些

这是我目前使用的查询

SELECT HR.EMPLOYEE, HR_SUPERVISOR.Name
FROM data.dbo.HR
INNER JOIN data.dbo.HR_SUPERVISOR
ON HR.ID = hr_supervisor.ID
WHERE HR.EMPLOYEE IN
  (SELECT HR.EMPLOYEE FROM data.dbo.HR GROUP BY HR.EMPLOYEE HAVING COUNT(*) > 1) AND
  HR_SUPERVISOR.Name like '%Test%' 
  GROUP BY HR_SUPERVISOR.name, HR.EMPLOYEE
  ORDER BY HR.EMPLOYEE ASC

【问题讨论】:

您使用的是哪个 dbms? SQL 标准 2014 与管理工作室 2012 docs.microsoft.com/en-us/sql/t-sql/queries/… 好的,我对数据透视表完全陌生,所以这可能需要一些时间才能弄清楚,尤其是使用 JOIN。 员工/主管的数量是否有限?您是否期望最多说员工 5/主管 5?或者它可以是任何数字? 【参考方案1】:

如果监督者的最大数量较少(1-10),您可以使用以下方法:

    获取内部联接作为最终查询的基础数据 为主管生成行号 使用一些子选择使其水平(如果您使用 where 子句预过滤 baseData 查询,它将运行得足够快)
create view vw_Supervisors as
with baseData as 
(
    SELECT 
        HR.id id, 
        ROW_NUMBER() OVER (partition by HR.id order by HR_SUPERVISOR.Name asc) rowNo, 
        HR.EMPLOYEE employee, 
        HR_SUPERVISOR.Name supervisor 
    FROM HR INNER JOIN HR_SUPERVISOR ON HR.ID = hr_supervisor.ID
)
select 
    b.id,
    b.EMPLOYEE, 
    SUPERVISOR1=(select supervisor from baseData b1 where b1.id=b.id and rowNo=1), 
    SUPERVISOR2=(select supervisor from baseData b1 where b1.id=b.id and rowNo=2), 
    SUPERVISOR3=(select supervisor from baseData b1 where b1.id=b.id and rowNo=3),
    SUPERVISOR4=(select supervisor from baseData b1 where b1.id=b.id and rowNo=4),
    SUPERVISOR5=(select supervisor from baseData b1 where b1.id=b.id and rowNo=5)
from baseData b 
group by b.id, b.employee;

如果有许多可能的列,您应该使用 XML 方式使其水平,您可以找到它的示例(行到列 t-sql),但是服务器运行需要更多的努力并且更难在前端处理,因为列数的变化。

【讨论】:

以上是关于SQL JOIN - 选择非不同行的值的主要内容,如果未能解决你的问题,请参考以下文章

删除非不同行

在Oracle SQL中从同一列的不同行中选择多个变量的值

Sql语句优化-查询两表不同行NOT INNOT EXISTS连接查询Left Join

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据

SQL join:当值不在一组值中时如何选择

SQL-如何根据列从不同行中选择值