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 - 选择非不同行的值的主要内容,如果未能解决你的问题,请参考以下文章
Sql语句优化-查询两表不同行NOT INNOT EXISTS连接查询Left Join