2013-10-17 37 views
0

我有一個叫做「MainTable」與下面的數據表
enter image description here如何在一個簡單的Oracle查詢中使用「存在」

稱爲「ChildTable」與下面的數據的另一個表(foreighn鍵數字)
enter image description here

現在我想從'ChildTable'中獲取那些記錄,如果至少存在一個'S'狀態。 但如果這個數字ID「R」任何其他記錄,然後我不想把它拿來 事情是這個 - enter image description here

我嘗試以下

Select m.Number, c.Status from MainTable m, ChildTable c 
where EXISTS (SELECT NULL         
       FROM ChildTable c2      
       WHERE c2.status =’S’ and c2.status <> ‘R’       
       AND c2.number = m.number) 

但現在我越來越有記錄'R'身份也是,我做錯了什麼?

回答

1

帶'R'的子記錄可能與一個可維護記錄相關聯,該維護記錄也有另一個具有狀態'S'的子記錄 - 這就是您的查詢所要求的。

Select 
    m.Number, 
    c.Status 
from MainTable m 
join ChildTable c on c.number = m.number 
where EXISTS (
     SELECT NULL         
     FROM ChildTable c2      
     WHERE c2.status =’S’       
      AND c2.number = m.number) and 
     NOT EXISTS (
     SELECT NULL         
     FROM ChildTable c2      
     WHERE c2.status =’R’       
      AND c2.number = m.number) 
+0

完美!這是我正在尋找的。謝謝。 –

2

你可以嘗試這樣的事情

select num, status 
from 
(select id, num, status, 
sum(decode(status, 'R', 1, 0)) over (partition by num) Rs, 
sum(decode(status, 'S', 1, 0)) over (partition by num) Ss 
from child_table) t 
where t.Rs = 0 and t.Ss >= 1 
-- and status = 'S' 

Here is a sqlfiddle demo

0
WITH ChildrenWithS AS (
    SELECT Number 
    FROM ChildTable 
    WHERE Status = 'S' 
) 
,ChildrenWithR AS (
    SELECT Number 
    FROM ChildTable 
    WHERE Status = 'R' 
) 
SELECT MaintTable.Number 
     ,ChildTable.Status 
FROM MainTable 
    INNER JOIN ChildTable 
     ON MainTable.Number = ChildTable.Number 
WHERE MainTable.Number IN (SELECT Number FROM ChildrenWithS) 
     AND MainTable.Number NOT IN (SELECT Number FROM ChildrenWithR) 
相關問題