2010-12-10 74 views
0
select * from qvalues where rowid in (

select rowid from qvalues where rowid in (select rowid from batchinfo where datapath not like '%thc%' and datapath not like '%pain%' and datapath not like 'tf1' and datapath like '%excel short%') 
and (compound='etg') 
and name='qc1' 
group by rowid 
having (COUNT(rowid)>1)) 
and name='qc1' 
order by rowid,rid 

上面的語句刪除值返回此:幫助與困難T-SQL查詢

rid name compound rt response finalConc qvalue rowid 
508898 QC1 ETG 33,463.34 3,388.83 719.38 100 17800 
508900 QC1 ETG 33,463.34 3,388.83 617.09 100 17800 
510382 QC1 ETG 41,657.33 4,662.37 742.01 100 17860 
510384 QC1 ETG 33,463.34 3,388.83 617.09 100 17860 
527192 QC1 ETG 106,578.46 15,116.28 894.79 100 18478 
527194 QC1 ETG 33,463.34 3,388.83 617.09 100 18478 
527198 QC1 ETG 110,313.48 16,699.65 877.02 100 18479 
527200 QC1 ETG 33,463.34 3,388.83 617.09 100 18479 
527204 QC1 ETG 107,128.41 15,052.29 852.51 100 18480 
527206 QC1 ETG 33,463.34 3,388.83 617.09 100 18480 
527210 QC1 ETG 116,257.86 16,929.16 841.9 100 18481 
527212 QC1 ETG 33,463.34 3,388.83 617.09 100 18481 
527216 QC1 ETG 102,569.68 17,601.24 991.17 100 18482 
527218 QC1 ETG 33,463.34 3,388.83 617.09 100 18482 
527222 QC1 ETG 120,925.71 15,204.38 715.48 100 18483 
527224 QC1 ETG 33,463.34 3,388.83 617.09 100 18483 
529873 QC1 ETG 213,327.65 26,499.14 691.04 100 18576 
529875 QC1 ETG 33,463.34 3,388.83 617.09 100 18576 
540030 QC1 ETG 69,627.37 9,401.47 814.5 100 18987 
540032 QC1 ETG 33,463.34 3,388.83 617.09 100 18987 
540182 QC1 ETG 56,768.32 7,682.65 921.53 100 18993 
540184 QC1 ETG 33,463.34 3,388.83 617.09 100 18993 
540186 QC1 ETS 92,853.28 2,428.01 14.06 100 18994 

我想只保留行具有第一獨特的ROWID,並刪除其餘部分。如何刪除第一次出現的唯一ROWID後的每條記錄?

回答

1

這可能有幫助。

WITH cte AS 
    (
    SELECT rowid, 
     ROW_NUMBER() OVER (PARTITION BY rowid ORDER BY rid) AS sequence 
    FROM qvalues 
    WHERE rowid IN 
     (SELECT rowid 
     FROM batchinfo 
     WHERE datapath NOT LIKE '%thc%' 
      AND datapath NOT LIKE '%pain%' 
      AND datapath NOT LIKE 'tf1' 
      AND datapath LIKE '%excel short%' 
     ) 
     AND (compound='etg') 
     AND name='qc1' 
    GROUP BY rowid 
    HAVING COUNT(rowid)>1 
    ) 

DELETE 
FROM cte 
WHERE sequence > 1 

該查詢使用公用表表達式(CTE)獲取行,併爲每個rowid組添加一個序列號。序列由rid命令決定。所以,第一個rowid有最小的擺脫。

delete語句刪除不是組中第一行的所有行。

+0

呵呵,我從來沒有想過通過CTE從表格中刪除數值......我必須記住這一點。雖然我讀了「刪除所有其他」,暗示「從結果」。 – chezy525 2010-12-10 17:58:02

0

我假定你的意思是第一個,「有最低的擺脫」,在這種情況下,下面應該工作。

;with cte as (
    --put your query here 
) 
select c1.* 
from cte c1 
    join (
    select rowID, min(rid) minRID 
    from cte 
    group by rowID 
) c2 on c1.rowID=c2.rowID 
     and c1.rid = c2.minRID 

這就是說,我的直覺反應是,你的初始查詢可以有所優化,使一切都變得更簡單。但是,我不知道,如果沒有架構...所以也許不是......

0
WITH cte AS 
(
select rowid from qvalues where rowid in (select rowid from batchinfo where datapath not like '%thc%' and datapath not like '%pain%' and datapath not like 'tf1' and datapath like '%excel short%') 
and (compound='etg') 
and name='qc1' 
group by rowid 
having (COUNT(rowid)>1) 
) 
SELECT qvalues.* FROM qvalues INNER JOIN cte ON cte.rowid = qvalues.rowid 
WHERE qvalues.rid = (SELECT MIN(rid) from cte where cte.rowid = qvalues.rowid) 
ORDER BY rowid 

這應該做的工作:) 您使用公共表表達式,一旦做了,你得到的MIN(rid)行。