0

我有一个名为“MainTable”的表,其中包含以下数据
在此处输入图像描述

另一个名为“ChildTable”的表,包含以下数据(外键数字)
在此处输入图像描述

现在,如果至少存在一个“S”状态,我想从“ChildTable”中获取这些记录。但是,如果这个号码的任何其他记录 id 为“R”,那么我不想获取它 像这样的东西- 在此处输入图像描述

我试过以下

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”状态的记录,我做错了什么?

4

3 回答 3

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'

这是一个 sqlfiddle 演示

于 2013-10-17T10:29:33.833 回答
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)
于 2013-10-17T10:25:51.650 回答
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)
于 2013-10-17T10:30:57.820 回答