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,确实会得到所需的设置。