ลบข้อมูลเรคคอร์ดที่ซ้ำออกไปให้เหลือเรคคอร์ดเดียวค่ะ
ตอนนี้ลองเขียน select ขึ้นมาก่อนค่ะ แบบนี้ค่ะ
select min(sale) as saledup,stockcode,warehouse,balqty from mor_history where yearrang='2010' and monthrang='5'
group by stockcode,warehouse,balqty
order by stockcode,warehouse
เอาแบบค่าน้อยไปเลย แต่ยังลบไม่ได้ คือรู้แต่วิธี
DELETE FROM mor_history where stockcode not in (select.....)
แต่ว่ามันไม่ได้ค่ะ เพราะมันมีคีย์หลายตัว คือ stockcode,warehouse
ใครทราบรบกวนหน่อยนะค่ะ
Date :
2010-08-05 23:38:04
By :
somooo
1.มี pk id อยู่ใช่ปะคะ เพราะจะแยกข้อมูลที่ซ้ำกันเป๊ะเพื่อเอาไปทำรัยสักอย่างต้องมี pkid ถ้าไม่มีจะได้ใส่ให้
2.แล้วกรณี stockcode และ warehouse ซ้ำกันแต่ sale >0 จะให้ลบตัวไหน
3.เกิดกรณี มี sale=0 มากกว่า 1 record แล้วยังมี sale >0 เข้ามาด้วยจะให้ลบยังไงคะ
Date :
2010-08-06 10:38:52
By :
blurEyes
1.มี pk id อยู่ใช่ปะคะ เพราะจะแยกข้อมูลที่ซ้ำกันเป๊ะเพื่อเอาไปทำรัยสักอย่างต้องมี pkid ถ้าไม่มีจะได้ใส่ให้
-- ไม่มีค่ะ
2.แล้วกรณี stockcode และ warehouse ซ้ำกันแต่ sale >0 จะให้ลบตัวไหน
-- ตัวไหนก็ได้ค่ะ อันนี้จะคล้ายๆกรณีเจอที่เป็น 0 ทั้งคู่ จะลบอันไหนก็ได้ค่ะ
3.เกิดกรณี มี sale=0 มากกว่า 1 record แล้วยังมี sale >0 เข้ามาด้วยจะให้ลบยังไงคะ
-- ให้ลบที่เป็น 0 ออกไป เก็บที่ sale > 0 ไว้ ค่ะ
ปล. จริงๆหาวิธีแก้ปัญหาได้แล้วค่ะ แต่ไม่ได้เขียน sql command เพราะเขียนไม่ได้สักที แต่ก็อยากจะทราบวิธีเขียนค่ะ รบกวนด้วยนะค่ะ
Date :
2010-08-06 13:35:04
By :
somooo
ุหุหุ ใครออกแบบ database เนี่ยน่าตีจริงๆ
Date :
2010-08-06 13:54:32
By :
tungman
อย่าตีเลยค่ะ มือใหม่หัดขับ เด๋วอีกหน่อยต้องดีกว่านี้แน่นอนค้าาา อิอิ
Date :
2010-08-06 14:03:37
By :
somooo
Code (C#)
CREATE TABLE #SomOOO_Request_03_2010
(
YearRange INT NULL,
MonthRange INT NULL,
StockCode NVARCHAR(100) NULL,
Warehouse NVARCHAR(100) NULL,
balQty INT NULL,
balVal FLOAT NULL,
sale FLOAT NULL
) ;
INSERT #SomOOO_Request_03_2010 VALUES
(2010,5,'107645.0010' ,'SAMPLE' ,0 ,0 ,0),
(2010,5,'107645.0010' ,'SAMPLE' ,0 ,0 ,0),
(2010,5,'107646.0010' ,'SAMPLE' ,0 ,0 ,0),
(2010,5,'107646.0010' ,'SAMPLE' ,0 ,0 ,0),
(2010,5,'107651.0010' ,'01' ,46 ,0 ,0),
(2010,5,'107651.0010' ,'01' ,46 ,0 ,23),
(2010,5,'107653.0010' ,'01' ,1 ,0 ,0),
(2010,5,'107653.0010' ,'01' ,1 ,0 ,0),
(2010,5,'107659.0010' ,'EXTRA' ,0 ,0 ,0),
(2010,5,'107659.0010' ,'EXTRA' ,0 ,0 ,0),
(2010,5,'107659.0010' ,'EXTRA' ,0 ,0 ,0),
(2010,5,'107659.0010' ,'EXTRA' ,0 ,0 ,10),
(2010,5,'107659.0010' ,'EXTRA' ,0 ,0 ,40),
(2010,5,'107659.0010' ,'EXTRA' ,0 ,0 ,40);
SELECT * FROM #SomOOO_Request_03_2010;
-- FIRST SUBJECT ELIMINATE SALE ZERO REMAIN AT ONCE
WITH AddFakeIDTABLE AS
(
SELECT ROW_NUMBER() OVER(ORDER BY '{' + StockCode + '}.{'+ Warehouse + '}' ) AS FAKE_ID
,'{' + StockCode + '}.{'+ Warehouse + '}' AS [BindKey]
,* FROM #SomOOO_Request_03_2010
)
-- DELETE FROM JOIN RESULTSET
DELETE FROM AddFakeIDTABLE
FROM
(
SELECT [FAKE_ID] ,[BindKey] FROM AddFakeIDTABLE
WHERE [sale] =0
) AS A1 (FAKE_ID,[BindKey])
RIGHT JOIN
(
SELECT MIN([FAKE_ID]) AS [LEAST_ID],[BindKey] FROM AddFakeIDTABLE
WHERE [sale] =0
GROUP BY [BindKey]
HAVING COUNT([FAKE_ID])>1
) AS A2 ([LEAST_ID] ,[BindKey])
ON A1.[BindKey] = A2.[BindKey]
WHERE (AddFakeIDTABLE.[BindKey]=A1.[BindKey])
AND (AddFakeIDTABLE.[FAKE_ID] <> A2.[LEAST_ID]) AND (A1.[FAKE_ID] <> A2.[LEAST_ID])
AND (SALE=0);
SELECT * FROM #SomOOO_Request_03_2010;
-- FINAL PHASE
WITH AddFakeIDTABLE AS
(
SELECT ROW_NUMBER() OVER(ORDER BY '{' + StockCode + '}.{'+ Warehouse + '}' ,[sale] ASC) AS FAKE_ID
,'{' + StockCode + '}.{'+ Warehouse + '}' AS [BindKey]
,* FROM #SomOOO_Request_03_2010
)
DELETE FROM AddFakeIDTABLE
FROM
AddFakeIDTABLE
RIGHT JOIN
(
SELECT MAX([FAKE_ID]) AS [MOST_ID],[BindKey] FROM AddFakeIDTABLE
GROUP BY [BindKey]
HAVING COUNT([FAKE_ID])>1
) AS A2 ([MOST_ID] ,[BindKey])
ON AddFakeIDTABLE.[BindKey] = A2.[BindKey]
WHERE AddFakeIDTABLE.[FAKE_ID] <> A2.[MOST_ID] ;
SELECT * FROM #SomOOO_Request_03_2010;
DROP TABLE #SomOOO_Request_03_2010;
มี select อยุ่ 3 ที่ ซึ่งจะแสดงให้เห็นว่าข้อมูลถูกลบไปทีละนิดจนเสร็จค่ะ
ถ้าไม่มี pkid ให้แบบนี้จะเอาไปรันกับข้อมูลเยอะๆคงไม่ได้ mssql server knock แน่นอนค่ะ
ให้เปลี่ยนเป็น fecth ข้อมูลมาทีละ 1000 record ไปเรื่อยๆ
อ้อเกือบลืมไป row_number มีใน mssql server 2005 ขึ้นมานะคะ
ประวัติการแก้ไข 2010-08-07 04:00:41 2010-08-07 04:01:48 2010-08-07 04:05:14 2010-08-07 04:15:23
Date :
2010-08-07 03:49:47
By :
blurEyes
Load balance : Server 02