2015-05-27 3 views
1

Я новичок в этом и использую Oracle SQL. У меня есть следующие таблицы:Oracle SQL - не в подзапросе

Таблица 1 CaseDetail

CaseNumber | CaseType 
1   | 'RelevantToThisQuestion' 
2   | 'RelevantToThisQuestion' 
3   | 'RelevantToThisQuestion' 
4   | 'NotRelevantToThisQuestion' 

Таблица 2 LinkedPeople

CaseNumber | RelationshipType | LinkedPerson 
1   | 'Owner'   | 123 
1   | 'Agent'   | 124 
1   | 'Contact'  | 125 
2   | 'Owner'   | 126 
2   | 'Agent'   | 127 
2   | 'Contact'  | 128 
3   | 'Owner'   | 129 
3   | 'Agent'   | 130 
3   | 'Contact'  | 131 

Таблица 3 Расположение

LinkedPerson| Country 
123   | 'AU' 
124   | 'UK' 
125   | 'UK' 
126   | 'US' 
127   | 'US' 
128   | 'UK' 
129   | 'UK' 
130   | 'AU' 
131   | 'UK' 

Я хочу посчитать CaseNumbers, которые имеют отношение к этому вопросу без LinkedPeople в 'AU'. Таким образом, результаты по вышеуказанным данным будут 1

Я пытался объединить функции и подзапросы агрегатов, но я думаю, что я мог бы слишком усложнять ситуацию.

Просто нужно нажать в правильном направлении, спасибо!

+0

Жаль, что я пытался быть умным, упрощая мой сценарий вопрос, но на самом деле я слишком упрощенно и полностью сделал вопрос другой. – user4946727

ответ

0

Чтобы получить все записи:

SELECT COUNT(DISTINCT CaseNumber) 
FROM LinkedPeople 
WHERE CaseNumber NOT IN 
(
    SELECT DISTINCT C.CaseNumber 
    FROM CaseDetail C  
    INNER JOIN LinkedPeople P ON C.CaseNumber = P.CaseNumber 
    INNER JOIN Location L 
    ON P.LinkedPerson = L.LinkedPerson 
    WHERE Country = 'AU' AND C.CaseType = 'RelevantToThisQuestion' 
) 
+1

Спасибо, что я искал. Только изменение, которое я сделал, - это изменить критерии C.CaseType в подзапросе. – user4946727

0

Я не уверен, что точный синтаксис, но я верю, что вы хотите что-то вроде:

select count distinct CaseNumber from LinkedPeople where Country != 'AU'

+0

Извините, я пытался быть умным в своем вопросе, на самом деле есть третья таблица с информацией о стране. Я отредактирую. – user4946727

1

SQL Fiddle

Настройка схемы Oracle 11g R2:

CREATE TABLE CASEDETAIL (CaseNumber, CaseType) AS 
      SELECT 1, 'RelevantToThisQuestion' FROM DUAL 
UNION ALL SELECT 2, 'RelevantToThisQuestion' FROM DUAL 
UNION ALL SELECT 3, 'RelevantToThisQuestion' FROM DUAL 
UNION ALL SELECT 4, 'NotRelevantToThisQuestion' FROM DUAL; 

CREATE TABLE LINKEDPEOPLE (CaseNumber, RelationshipType, LinkedPerson) AS 
      SELECT 1, 'Owner', 123 FROM DUAL 
UNION ALL SELECT 1, 'Agent', 124 FROM DUAL 
UNION ALL SELECT 1, 'Contact', 125 FROM DUAL 
UNION ALL SELECT 2, 'Owner', 126 FROM DUAL 
UNION ALL SELECT 2, 'Agent', 127 FROM DUAL 
UNION ALL SELECT 2, 'Contact', 128 FROM DUAL 
UNION ALL SELECT 3, 'Owner', 129 FROM DUAL 
UNION ALL SELECT 3, 'Agent', 130 FROM DUAL 
UNION ALL SELECT 3, 'Contact', 131 FROM DUAL; 

CREATE TABLE LOCATION (LinkedPerson, Country) AS 
      SELECT 123, 'AU' FROM DUAL 
UNION ALL SELECT 124, 'UK' FROM DUAL 
UNION ALL SELECT 125, 'UK' FROM DUAL 
UNION ALL SELECT 126, 'US' FROM DUAL 
UNION ALL SELECT 127, 'US' FROM DUAL 
UNION ALL SELECT 128, 'UK' FROM DUAL 
UNION ALL SELECT 129, 'UK' FROM DUAL 
UNION ALL SELECT 130, 'AU' FROM DUAL 
UNION ALL SELECT 131, 'UK' FROM DUAL; 

Запрос 1:

SELECT COUNT(DISTINCT CASENUMBER) AS Num_Relevant_Cases 
FROM CASEDETAIL c 
WHERE CaseType = 'RelevantToThisQuestion' 
AND NOT EXISTS (SELECT 1 
        FROM LINKEDPEOPLE p 
          INNER JOIN LOCATION l 
          ON (p.LinkedPerson = l.LinkedPerson) 
        WHERE c.CaseNumber = p.CaseNumber 
        AND l.Country = 'AU') 

Results:

| NUM_RELEVANT_CASES | 
|--------------------| 
|     1 | 
Смежные вопросы