Sql server 列A中出现值的行>;1但B列中的相应值不';T

Sql server 列A中出现值的行>;1但B列中的相应值不';T,sql-server,tsql,Sql Server,Tsql,我有一张这样的桌子: SchoolName|SchoolID -------------------- School A |x School B |x School C |y School D |z School D |z 实际上有更多的列,包括一个唯一的ID。以上只是为了简洁 我需要做的是选择SchoolID多次出现的所有列,但前提是SchoolName列中的对应值没有出现 所以我想得到A学校和B学校行的所有列,但不是C学校和d学校行 数据库是MS SQL 2008 R2 最初的问

我有一张这样的桌子:

SchoolName|SchoolID
--------------------
School A  |x
School B  |x
School C  |y
School D  |z
School D  |z
实际上有更多的列,包括一个唯一的ID。以上只是为了简洁

我需要做的是选择SchoolID多次出现的所有列,但前提是SchoolName列中的对应值没有出现

所以我想得到A学校和B学校行的所有列,但不是C学校和d学校行

数据库是MS SQL 2008 R2


最初的问题非常混乱,希望我现在能够正确地重新表述它

那么你想要这样的东西吗

SELECT A.*
FROM yourTable A
CROSS APPLY (
                SELECT TOP 1 NULL col
                FROM yourTable 
                WHERE A.SchoolID = SchoolID
                AND A.SchoolName = SchoolName
                GROUP BY SchoolID,SchoolName
                HAVING COUNT(*) > 1
            ) CA

您可以使用
COUNT
的窗口版本来计算
SchoolID
SchoolName
发生的次数:

SELECT *
FROM (
   SELECT *,
         COUNT(*) OVER (PARTITION BY SchoolID) AS cntSchoolID,
         COUNT(*) OVER (PARTITION BY SchoolID, SchoolName) AS cntSchoolName 
   FROM mytable ) t
WHERE t.cntSchoolID > 1 AND t.cntSchoolName = 1

我会建立一个列表,列出所有重复的学名和所有重复的学号,然后提取学名或学号匹配的所有行:

select
*
from
mytable
where
(schoolname in
(
select schoolname
from
mytable
group by schoolname
having count (*) > 1)
OR
schoolid in 
(
select
schoolid
from
mytable
group by schoolid
having count (*) > 1)
 )
难看,但我认为这会给你你想要的结果


你能解释一下为什么不应该退回D学校吗?本例中的B列是什么?当没有多次出现的对应值时,为什么要返回School A&B?对不起,应该说“School Name column”,而不是“column B”。感谢您指出Tab Alleman,我不知道我写这篇文章时的想法。希望编辑后的问题现在更有意义。有趣的是,我不知道交叉应用,很有用!不幸的是,您正确地解决了我提出的错误的原始(后来编辑)问题。;)但是谢谢你,很好!谢谢安德鲁,但我想你回答了我原来的问题,现在已经编辑好了?不过,将OR改为AND,将SchoolName计数改为=1而不是>1,确实会得到所需的设置。