2013-03-15 65 views
0

我不知道如何解释这种情况,这有点棘手,所以我会尝试给你一个我拥有的数据和输出I的示例需要:选择列B只有列A不同实例的所有记录

CREATE TABLE #TempTable(A int, B int) 
INSERT INTO #TempTable (A,B) 
VALUES 
(1,1), 
(1,2), 
(1,2), 
(1,4), 
(3,2), 
(3,2), 
(3,2), 
(3,3), 
(3,3); 

我无法弄清楚如何选择的所有记录,使得最终的输出是:

1,1 
1,4 
3,3 
3,3 

我需要在那里列B只有A列的不同实例记录所有其他实例应该被忽略... 我觉得这应该是漂亮的很简单,但我正在消隐,我无法弄清楚。

更新:

我一直有一个很难解释这一点,但我认为这是正确的逻辑:你可以有B的重复的实例对于给定的A,但你不能有B跨越不同A的重复实例。

+4

我必须错过某些东西为什么在您的列表中给出了您定义的规则中的3,3 ... – xQbert 2013-03-15 19:24:47

+1

您使用哪种数据库系统? – MarcinJuraszek 2013-03-15 19:26:46

+0

@xQbert对于给定的A,您可以有B的重复实例,但不能在不同的A之间有B的重复实例。 – Kiril 2013-03-15 19:30:57

回答

2
SELECT A, B FROM TempTable 
WHERE B IN (
    SELECT B 
    FROM TempTable 
    GROUP BY B 
    HAVING COUNT(DISTINCT A) = 1 
) 

工作在MS SQL 2012例如:http://sqlfiddle.com/#!6/d235a/4

+0

缺少3,3;我认为我的需求需要修改:对于给定的A,可以有重复的B实例,但不能在不同的A之间有重复的B实例。 – Kiril 2013-03-15 19:33:09

+0

我一直在努力实际地描述这个需求,因为它有点模糊,但我想我已经缩小了它的范围。 – Kiril 2013-03-15 19:35:08

+0

更新了我的回答。 – MarcinJuraszek 2013-03-15 19:35:24

2

尝试:

with cte as 
(select t.*, min(A) over (partition by B) minA, max(A) over (partition by B) maxA 
from #TempTable t) 
select A, B 
from cte 
where minA=maxA 
相关问题