2012-05-25 135 views
2

我有一个3列的表格:id,val1val2选择具有多个不同列值组合的行

对于val2的每个不同值,我想选择所有行,其中多个 val1的不同值存在。

例子:

| id | val1 | val2 | 
|------------------| 
| 1 | A1 | a2 | 
| 2 | A1 | a2 | 
| 3 | A1 | b2 | 
| 4 | B1 | b2 | 
| 5 | A1 | c2 | 
| 6 | A1 | c2 | 
| 7 | A1 | c2 | 
| 8 | A1 | d2 | 
| 9 | C1 | d2 | 
| 10 | A1 | d2 | 

期望的结果:

| id | val1 | val2 | 
|------------------| 
| 3 | A1 | b2 | 
| 4 | B1 | b2 | 
| 8 | A1 | d2 | 
| 9 | C1 | d2 | 
| 10 | A1 | d2 | 

我没能拿出任何查询,让我做这件事,也许别人对如何解决的想法这个。

+0

什么DB系统? MSSQL 2005/08/12,MySQL ... – Paddy

+0

@Paddy:Postgres 9.1 – smerlin

+0

第8行和第10行除了ID号之外都是相同的。我不明白你为什么要包括8和10,但排除1和2,除了id号码外,它们也是相同的。 –

回答

2

使用集合窗口函数,你也可以做这样的:

SELECT 
    id, 
    val1, 
    val2 
FROM (
    SELECT 
    *, 
    MIN(val1) OVER (PARTITION BY val2) AS minval1, 
    MAX(val1) OVER (PARTITION BY val2) AS maxval1 
    FROM atable 
) s 
WHERE minval1 <> maxval1 
+0

非常好,您的查询几乎是我的两倍。而且它更具可读性。 – smerlin

2
SELECT * 
FROM TABLE_2 
WHERE EXISTS (SELECT 1 
       FROM (SELECT val2, 
           val1, 
           Count(*) AS Number 
         FROM TABLE_2 
         GROUP BY val2, 
           val1 
         HAVING Count(*) = 1) a 
       WHERE TABLE_2.val2 = a.val2) 
ORDER BY ID 
+1

这仅返回第3和4行 - http://sqlfiddle.com/#!3/44422/37 – Paddy

+0

@Romil:是的,它现在有效,因为你和Andomars查询都是正确的,我会检查哪个产生更好的性能与更大的表(我的表不是那么大) – smerlin

6

你可以使用一个having条款与的val1多个不同的值,搜索val2。例如:

select yt.* 
from YourTable yt 
join (
     select val2 
     from YourTable 
     group by 
       val2 
     having count(distinct val1) > 1 
     ) as filter 
on  yt.val2 = filter.val2 
+0

我运行我的例子,这返回了正确的结果。 – smerlin

+1

@aF:它与示例结果相符,请参阅Paddy的[SQLFIddle](http://sqlfiddle.com/#!3/0dc5e/1) – Andomar

2

尝试此查询:

SELECT * from tbl where val2 in (SELECT val2 FROM `tbl` group by val2 having 
count(distinct(val1)) > 1) 
相关问题