【问题标题】:SQL - How to select rows which have the same multiple valuesSQL - 如何选择具有相同多个值的行
【发布时间】:2018-01-10 14:01:28
【问题描述】:

我将从我的表格的简化示例开始:

+-----+----------+
|Name |Teaches   |
+-----+----------+  
|Dave |Science   |
+-----+----------+  
|Dave |History   |
+-----+----------+  
|Alice|History   |
+-----+----------+  
|Alice|Literature|
+-----+----------+  
|Alice|Science   |
+-----+----------+  
|John |History   |
+-----+----------+

我正在尝试选择那些也与戴夫教授相同课程的人。 (在这种情况下,爱丽丝)。我正在考虑使用光标浏览 Dave 的课程并选择那些教授相同课程的人并将结果相交,但我想知道是否有更好(更简单)的方法。

【问题讨论】:

  • 自加入应该可以工作。快速简便。

标签: sql sql-server select


【解决方案1】:

这是一种方法:

select t.name
from t join
     t td
     on td.teaches = t.teaches 
where td.name = 'Dave'
group by t.name
having count(*) = (select count(*) from t where t.name = 'Dave');

【讨论】:

  • 这有很多聚合?
  • @VamsiPrabhala 。 . . “戴夫”教授戴夫教授的所有课程:“我正在尝试选择那些也教授与戴夫相同课程的人”。当然,如果他/她愿意,OP 可以过滤掉 Dave。
【解决方案2】:

你需要使用Self join,类似这样的

SELECT a.NAME
FROM   Table1 a
       INNER JOIN (SELECT Teaches,
                          Count(*)OVER() AS cnt
                   FROM   Table1
                   WHERE  NAME = 'Dave') b
               ON a.Teaches = b.Teaches
WHERE  a.NAME <> 'Dave'
GROUP  BY a.NAME,
          b.cnt
HAVING Count(*) = b.cnt 

【讨论】:

    【解决方案3】:

    一种方法,这里使用CTE。

    ;WITH CTE_Parent
    AS  (
        SELECT  Name,Teaches,COUNT(*) OVER() AS Parent_Count
        FROM    @Teachers
        WHERE   Name    =   'Dave'
    )
    
    SELECT  T.Name
    FROM    @Teachers   AS  T
        INNER JOIN  CTE_Parent  AS  C   ON  C.Name  <>  T.Name
                                        AND C.Teaches=  T.Teaches
    GROUP BY T.Name,C.Parent_Count
    HAVING  COUNT(*)    =   C.Parent_Count
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2014-07-14
      相关资源
      最近更新 更多