Oracle/SQL - 查找具有不包含相似记录的一个值的记录
好吧,让我更好地解释这一点。假设我有一个人员列和一个类型列。同一个人可能多次出现在表格中,但具有不同的类型。我希望所有具有指定类型的人,除非他们与其他类型一起列出。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
谢谢!
这将做到:
SELECT person
FROM table
GROUP BY person
HAVING MIN(type) = 'S' AND MAX(type) = 'S'
不过,如果你有多个记录为同一人,并键入“S”,那么这将删除这些重复
select person, type
from myTable
where type = 'S'
and person NOT IN (
select person
from myTable
where type in ('O', 'R')
)
我相信你的'类型不在'应该是'没有人'。我确实有这个工作,但总是被告知以这种方式使用'IN'效率低下,所以我试图看看是否有更有效的方法来做到这一点。虽然谢谢! – dscl 2011-03-02 15:55:13
啊,修好了。对于那个很抱歉。 :-) 谢谢!如果您想查看其效率/效率如何,请从http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html下载Oracle SQL Developer工具,并使用查询计划检查您尝试的每个版本的成本。这不是一个完美的测试,但它让你指出了正确的方向。 – SarekOfVulcan 2011-03-02 15:56:59
如果您有一组已知的类型,则此方法有效。您可能想要将NOT IN查询的where子句更改为“type!='S'”以获得通用结果。 – 2011-03-02 15:59:39
也许是这样的:
select distinct Person, Type
from table
where (Person, type) in
(select distinct Person, Type
from table
having count(*) = 1)
增加distincts处理您的案件。
我看着那样的东西,但担心人们在表格中多次出现类型'S',在这种情况下我希望他们返回。 – dscl 2011-03-02 15:59:12
作为一个选项,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;
就我个人而言,我认为“从t1开始,t2”就是eeeeevil,并且总是使用JOIN语法。 :-)它明确了哪些条件是过滤器,哪些是连接,并且更容易维护。 – SarekOfVulcan 2011-03-02 16:03:57
我同意并且通常也使用ANSI语法,但是发现很多人习惯了Oracle语法,所以他们对此不以为然。但我会稍后添加ANSI版本。 – 2011-03-02 16:10:01
SELECT DISTINCT person, ptype FROM persons p1
WHERE (SELECT COUNT(DISTINCT ptype)
FROM persons p2
WHERE p2.person = p1.person) = 1;
如何:
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
我喜欢Gary的性能方面的原因选择,而是一种更简单的方法是:
SELECT Person FROM mytable WHERE Type = 'S'
MINUS
SELECT Person FROM mytable WHERE Type IN ('O','R');
OP已经说过,同一个人可以多次出现在表格中,只有不同的类型,所以不需要担心。无论如何,这大致是我即将发布的答案,直到我看到您的解决方案。 (只有在我的情况下,我会使用稍微不同的条件,例如'HAVING MAX(type)='S'和COUNT(*)= 1'。)感谢(+1)让我减轻了工作负担。 :) – 2011-03-02 23:52:00