嵌套删除/ sql语句

时间:2010-12-13 23:01:17

标签: sql sql-server tsql sql-server-2008

以下语句返回:

select rowid,name,compound,COUNT(*) from qvalues where rowid in (select rowid from batchinfo where instrument='tf1')
group by rowid,name,compound
having COUNT(*)>1



rowid   name    compound    (No column name)
19300   QC1 ETG 2
20379   QC4 ETS 2
20686   QC2 ETG 2
19402   QC1 ETG 2
23605   QC1 ETG 2
21705   QC3 ETS 2
23678   QC1 ETG 2
18480   QC2 ETG 2

..... ...... .....

我有另一个名为qvalues的表:

rid name    compound    rt  response    finalConc   qvalue  rowid
229263  QC3 Hydromorphone   0.69    6228.00 82.53   98  4695
229264  QC3 Morphine    0.51    3168.00 119.89  99  4695
229265  QC3 Oxymorphone 0.57    2472.00 83.89   99  4695
229266  QC3 Benzoylecgonine 2.17    20439.25    85.99   95  4695
229267  QC3 Codeine 1.34    4829.00 82.85   96  4695
229268  QC3 Hydrocodone 1.58    12416.00    84.99   94  4695
229269  QC3 Oxycodone   1.47    5430.00 78.44   94  4695
229270  QC3 Buprenorphine   2.54    366.13  10.41   98  4695
229271  QC3 Mepbrobamate    2.50    1330.34 95.56   92  4695
229272  QC3 Methadone   2.68    85897.27    86.77   92  4695

我需要做的是从第一组中获取ROWID,NAME,COMPOUND的组合,并在第二组中仅保留它的第一次出现。我需要从复合中删除所有其他具有ROWID,NAME和COMPOUND组合的行。我需要保持RID最小的组合。

如果我需要澄清任何内容,请告诉我

2 个答案:

答案 0 :(得分:0)

我在第二组上创建一个表别名,按名称,化合物分组,具有MIN(rowid),然后将其连接到第一组。

然后使用NOT IN删除不在该集合中的所有内容。

答案 1 :(得分:0)

所以你想要删除batchinfo中除了具有最小rid ...

的记录之外的所有内容
delete qvalues where rid in
    (select rid
    from qvalues 
    where rowid in (select rowid from batchinfo where instrument='tf1') 
    except
    select rid
    from (select rid=min(rid)
        from qvalues
        where rowid in (select rowid from batchinfo where instrument='tf1') 
        group by rowid,name,compound) x);

count> 2不是必需的,因为在count = 1的情况下,它总是具有较小的记录。