2011-03-02 78 views
1

好吧,让我更好地解释这一点。假设我有一个人员列和一个类型列。同一个人可能多次出现在表格中,但具有不同的类型。我希望所有具有指定类型的人,除非他们与其他类型一起列出。Oracle/SQL - 查找具有不包含相似记录的一个值的记录

所以给出这个数据

Person Type 
-------------- 
Bob  S 
Sue  S 
Bob  O 
Tom  S 
Frank S 
Frank R 

我想看到谁拥有S型的人,而且也没有与任何O型或R.上市所以我的查询应该返回

Person Type 
-------------- 
Sue  S 
Tom  S 

谢谢!

回答

2

这将做到:

SELECT person 
FROM table 
GROUP BY person 
HAVING MIN(type) = 'S' AND MAX(type) = 'S' 

不过,如果你有多个记录为同一人,并键入“S”,那么这将删除这些重复

+0

OP已经说过,同一个人可以多次出现在表格中,只有不同的类型,所以不需要担心。无论如何,这大致是我即将发布的答案,直到我看到您的解决方案。 (只有在我的情况下,我会使用稍微不同的条件,例如'HAVING MAX(type)='S'和COUNT(*)= 1'。)感谢(+1)让我减轻了工作负担。 :) – 2011-03-02 23:52:00

0
select person, type 
    from myTable 
    where type = 'S' 
     and person NOT IN (
      select person 
       from myTable 
       where type in ('O', 'R') 
     ) 
+0

我相信你的'类型不在'应该是'没有人'。我确实有这个工作,但总是被告知以这种方式使用'IN'效率低下,所以我试图看看是否有更有效的方法来做到这一点。虽然谢谢! – dscl 2011-03-02 15:55:13

+0

啊,修好了。对于那个很抱歉。 :-) 谢谢!如果您想查看其效率/效率如何,请从http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html下载Oracle SQL Developer工具,并使用查询计划检查您尝试的每个版本的成本。这不是一个完美的测试,但它让你指出了正确的方向。 – SarekOfVulcan 2011-03-02 15:56:59

+0

如果您有一组已知的类型,则此方法有效。您可能想要将NOT IN查询的where子句更改为“type!='S'”以获得通用结果。 – 2011-03-02 15:59:39

0

也许是这样的:

select distinct Person, Type 
from table 
where (Person, type) in 
    (select distinct Person, Type 
    from table 
    having count(*) = 1) 

增加distincts处理您的案件。

+0

我看着那样的东西,但担心人们在表格中多次出现类型'S',在这种情况下我希望他们返回。 – dscl 2011-03-02 15:59:12

0

作为一个选项,NOT IN的语法,外连接可以处理太

select t1.person, t1.type  
from person_Type t1, person_type t2 
where t1.person = t2.person(+) 
and t1.type != t2.type(+) 
and t1.type = 'S' 
and t2.type is null; 

或者,响应注释 - 为那些喜欢谁的ANSI语法...

select t1.person, t1.type 
from person_type t1 
left outer join person_type t2 
on t2.person = t1.person 
and t2.type != t1.type 
where t1.type = 'S' 
and t2.type is null; 
+2

就我个人而言,我认为“从t1开始,t2”就是eeeeevil,并且总是使用JOIN语法。 :-)它明确了哪些条件是过滤器,哪些是连接,并且更容易维护。 – SarekOfVulcan 2011-03-02 16:03:57

+0

我同意并且通常也使用ANSI语法,但是发现很多人习惯了Oracle语法,所以他们对此不以为然。但我会稍后添加ANSI版本。 – 2011-03-02 16:10:01

0
SELECT DISTINCT person, ptype FROM persons p1 
WHERE (SELECT COUNT(DISTINCT ptype) 
FROM persons p2 
WHERE p2.person = p1.person) = 1; 
0

如何:

SELECT person, type 
FROM  MyTable t1 
WHERE (
     SELECT COUNT(DISTINCT type) 
     FROM @MyTable t2 
     WHERE t2.person = t1.person 
     AND t1.Type='s' 
     ) = 1 
GROUP BY person, type 
0

我喜欢Gary的性能方面的原因选择,而是一种更简单的方法是:

SELECT Person FROM mytable WHERE Type = 'S' 
MINUS 
SELECT Person FROM mytable WHERE Type IN ('O','R'); 
相关问题