2011-03-02 117 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'); 
相關問題