【问题标题】:SQL PIvot for a complex join用于复杂连接的 SQL Pivot
【发布时间】:2021-05-06 00:28:50
【问题描述】:

我有一张表,它为经理捕获名称值组。例如,id 为 1 的经理有两个组值对:location=dublin 和 dept=sales。

GROUP VALUE MANAGERID
LOCATION DUBLIN 1
DEPT SALES 1
LOCATION OSLO 2
DEPT SALES 2
LOCATION LONDON 3
DEPT SALES 3

我有另一个包含员工分组的表...

GROUP VALUE EMPLOYEEID
LOCATION DUBLIN 101
DEPT SALES 101
LOCATION DUBLIN 102
DEPT SALES 102
LOCATION DUBLIN 103
DEPT SALES 103
SHOESIZE 15 103
LOCATION OSLO 104
DEPT SALES 104

我想获取至少与特定经理具有相同分组的所有员工的列表。例如,id 为 1 的经理是 location=dublin 和 dept=sales,并且具有这些组值的员工至少是 101,102 和 103,但不是 104。

我事先不知道组列或值列的值。如果我在 group 和 value 列上做一个简单的内部连接,然后是一个不同的,我得到 101、102 103 和 104

有什么想法吗?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql oracle sqlite pivot-table transpose


【解决方案1】:

您可以通过表的CROSS 连接和条件聚合来做到这一点:

SELECT e.EMPLOYEEID
FROM managers m CROSS JOIN employees e
WHERE m.MANAGERID = 1
GROUP BY e.EMPLOYEEID
HAVING COUNT(DISTINCT m."GROUP") = 
       COUNT(CASE WHEN e."GROUP" = m."GROUP" AND  e."VALUE" = m."VALUE" THEN 1 END)

请参阅demo
结果:

EMPLOYEEID
101
102
103

【讨论】:

  • 非常聪明,但想知道外连接不只是表扫描吗?
  • @MoreThanFive 你是什么意思?必须进行表扫描,以便 MANAGERID = 1 的分组与员工的分组相匹配。您可以将联接更改为 FROM managers m INNER JOIN employees e ON m.MANAGERID = 1,但这实际上不会使其成为 INNER 联接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多