SQL特别从表中选择

时间:2012-08-23 06:20:27

标签: sql

我有一个包含大约20列和2000行的表。 例如:

Col1   Col2  Col3  Col4   ...
A01    22     AB   11
A01    22     AX   112
A01    23     A5   11
A02    20     AB   AA
A04    21     AB   11
A04    21     AU   11
A04    29     AB   BA
A05    21     AB   11
AAA    111    XX   18
AAA    222    GT   1O 
...

我需要一个select,它根据以下内容显示满足两列(Col1和Col2)要求的所有行和所有列:

如果Col1是唯一的 - 显示行, 要么 如果Col1不唯一,则仅当Col1和Col2相同时才显示所有行。 从previos表中选择结果后:

Col1   Col2  Col3  Col4   ...
A01    22     AB   11
A01    22     AX   112
A02    20     AB   AA
A04    21     AB   11
A04    21     AU   11
A05    21     AB   11
AAA    111    XX   18
...

新表(您的解决方案)包含数据: Col1 Col2 Col3 Col4 ......

A01 22 AB 11

A01 22 AX 112

A02 20 AB AA

A04 21 AB 11

A04 21 AU 11

A05 21 AB 11

AAA 111 XX 18

...

我不会从中看到的是:

Col1 Col2 Col3 Col4 ......

A01 2 AB 11

A02 1 AB AA

A04 2 AB 11

A05 1 AB 11

AAA 1 XX 18

...

2 个答案:

答案 0 :(得分:3)

在Oracle和MS SQL中,我会使用分析函数:

select * from
(
    select
        t.* ,
        count(Col1) over (partition by Col1) as count_col1,
        count(Col2) over (partition by Col1, Col2) as count_col2
    from yourTable t
) t
where count_col1 = 1 or count_col2 > 1;

请参阅this fiddle (Oracle)this fiddle (MSSQL)作为证据。

答案 1 :(得分:2)

select * 
from table t1
join (select col1
      from table
      group by col1
      having avg(col2)=max(col2)) t2
     on t1.col1=t2.col1

看到我没有查看你的例子..你的请求与示例略有不同,因为我的查询检查col1所有col2应该是相同的。它不会显示相同的那些。

在这种情况下,答案将是

select * 
from table1 t1
join (select col1,col2
      from table1
      group by col1,col2
      having count(*)>1
      union
      select col1,cast(null as varchar)
      from table1 group by col1
      having count(*)=1) t2
     on t1.col1=t2.col1 and t1.col2=isnull(t2.col2,t1.col2)

这是更新的查询,以及它的小提琴http://sqlfiddle.com/#!3/e944b/2/0

好的..再次更新:

select * 
from table1 t1
join (select col1,col2
     from table1
     group by col1,col2
     having count(*)>1
     union
     select col1,min(col2)
     from table1 group by col1
     having count(*)=1 or count(*)=count(distinct col2)) t2
     on t1.col1=t2.col1 and t1.col2=t2.col2

和小提琴http://sqlfiddle.com/#!3/d5437/12/0

对于第二个问题,这应该足够了:

select t3.* 
    from (select distinct col1 from table1)t1
    cross apply (select top 1 * from table1 t2 where t1.col1=t2.col1) t3

和小提琴:http://sqlfiddle.com/#!3/e944b/4/0