2012-01-10 56 views
4

我想找到比我的解決方案更有效的方法。所以這裏是問題: 我想從select語句中進行批量插入。 (背景資料:我使用MSSQL 2005)選擇的插入排除第二個,添加現有記錄中的第一個

例子:

SELECT number, amount, year, modifiedDate, itm, city, c, d, e, f.... FROM X 
JOIN Y .... 

所以,如果結果是

... 
Num Amount Year ModifiedDate Itm City ... ... 
1 100 2011 01-01-2011 2 Amsterdam .. .. 
1 100 2011 01-02-2011 5 Den Haag .. .. 
2 4560 2011 01-02-2011 6 Amsterdam .. .. 
33 456 2010 01-02-2011 12 Leiden .. .. 
22 456 2010 01-02-2011 12 Leiden .. .. 
.... 

在目標我想有:

... 
Num Amount Year ModifiedDate Itm City ... ... 
1 100 2011 01-02-2011 5 Den Haag .. .. 
2 4560 2011 01-02-2011 6 Amsterdam .. .. 
33 456 2010 01-02-2011 12 Leiden .. .. 
22 456 2010 01-02-2011 12 Leiden .. .. 
.... 

沒有此記錄:(1 100 2011 01-01-2011 2阿姆斯特丹)

我想將這兩個中的第一個插入目標表中。我還有其他應該插入的選擇。因此,在這種情況下,我想通過modifiedDate DESC採用第一個數字,金額和年份相同的訂單。這就是我想要做的。我已經用Cursor做了一個解決方案,但是應該有更好的方法。

+0

我還是不認爲這是足夠的信息。請顯示您的光標,以便我們可以確切地看到您在做什麼。 – 2012-01-10 15:42:24

+1

我不張貼遊標的原因是因爲我正在尋找另一種解決方案。用光標,我已經有了答案。我想知道是否有另一種方法。我不發佈整個查詢的原因是因爲它非常複雜,但基本上這就是這個想法。我認爲現在應該是明確的。讓我知道如果它仍然不清楚。 – Ekaterina 2012-01-10 15:44:22

+0

在這兩行之間,你如何從第二行中告訴第一行?您正在通過'modifiedDate'命令行,但這兩個具有相同的'modifiedDate'值。如果沒有其他分類標準,他們的特定順序將是任意的。 – 2012-01-10 18:51:15

回答

1

如果我理解您正在嘗試正確執行的操作,我認爲您需要對前三列進行分組,然後從modifiedDate列中選擇MAX值。

讓我知道如果我誤解了。

SELECT 
     number, 
     amount, 
     year, 
     MAX(modifiedDate) 
FROM  
     X 
GROUP BY 
     number, amount, year 

如果你也在尋找對查詢的INSERT部分幫助,請給你目前正在做的事情有更多的細節。

+0

是的,我的解釋確實不太準確。我添加了一些虛擬列。原始選擇比較複雜,大量列不相同,有些列在下面加入。我確實在where子句中嘗試了一些分組,但是我仍然沒有設法得到我想要的。 – Ekaterina 2012-01-10 15:27:26

+0

您應該始終在可行的情況下發布完整的代碼。這樣你就更有可能得到你真正需要的答案,即使需要更長的時間才能理解!我認爲我的回答沒有太大的幫助呢? – 2012-01-10 15:29:14

+0

的確,我想讓它更容易理解,但我想不是這樣。不,你的回答不是我正在尋找的。你有想法嗎?除了光標? – Ekaterina 2012-01-10 15:31:22

0

通過您所有的列進行分組將實現此目標。

例子:

--Test Data 
DECLARE @sourceTable TABLE(number int,amount int, yr int, modifiedDate datetime) 
DECLARE @destTable TABLE(number int,amount int, yr int, modifiedDate datetime) 

INSERT INTO @sourceTable (number, amount, yr, modifiedDate) VALUES (1,100,2011,'01 Jan 2011') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate) VALUES (1,100,2011,'01 Jan 2011') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate) VALUES (1,100,2011,'03 Jan 2011') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate) VALUES (1,100,2011,'02 Jan 2011') 

--Query 
INSERT INTO @destTable(number, amount, yr, modifiedDate) 
SELECT number, amount, yr, modifiedDate 
FROM @sourceTable 
GROUP BY number, amount, yr, modifiedDate 
ORDER BY modifiedDate DESC 

--Results 
SELECT * FROM @destTable 
+0

不是我在找什麼。我編輯了一下我的問題,因爲這是誤導。我有一個巨大的選擇,因此,由這個方式不工作。 – Ekaterina 2012-01-10 15:32:00

+0

你可以給我們目的地表的表def嗎? – Mack 2012-01-10 15:33:58

2

這應該讓你更接近你所需要的:

DECLARE @sourceTable TABLE(number int,amount int, yr int, modifiedDate datetime, itm int, City varchar(20)) 
DECLARE @destTable TABLE(number int,amount int, yr int, modifiedDate datetime, itm int, City varchar(20)) 

INSERT INTO @sourceTable (number, amount, yr, modifiedDate, Itm, City) VALUES (1,100,2011,'01-01-2011',2,'Amsterdam') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, Itm, City) VALUES (1,100,2011,'01-02-2011',5,'Den Haag') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, Itm, City) VALUES (2,4560,2011,'01-02-2011',6,'Amsterdam') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, Itm, City) VALUES (33,456,2010,'01-02-2011',12,'Leiden') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, Itm, City) VALUES (22,456,2010,'01-02-2011',12,'Leiden') 

;WITH CTE AS 
(
    SELECT number, amount, yr, modifiedDate 
    , ROW_NUMBER() OVER (PARTITION BY number, amount, yr ORDER BY modifiedDate DESC) AS itemRank 

    FROM @sourceTable 
    GROUP BY number, amount, yr, modifiedDate 
) 
INSERT INTO @destTable (number, amount, yr, modifiedDate, Itm, City) 
SELECT st.number, st.amount, st.yr, st.modifiedDate, st.Itm, st.City 
FROM @sourceTable st 
INNER JOIN cte ON st.number = cte.number 
AND st.amount = cte.amount 
AND st.yr = cte.yr 
AND st.modifiedDate = cte.modifiedDate 
WHERE itemRank = 1 
ORDER BY modifiedDate DESC 

SELECT * FROM @destTable 
3

感謝您對所有的答覆。我有一個不同的想法,比舊時光標快得多,我認爲它符合我的要求,所以我也在這裏分享它。

--Test Data 
DECLARE @sourceTable TABLE(number int,amount int, yr int, modifiedDate datetime, city nvarchar(100)) 
DECLARE @destTable TABLE(number int,amount int, yr int, modifiedDate datetime, city nvarchar(100)) 

INSERT INTO @sourceTable (number, amount, yr, modifiedDate, city) VALUES (1,100,2011,'01 Jan 2011', 'aaa') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, city) VALUES (1,100,2011,'02 Jan 2011', 'bbb') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, city) VALUES (2,4560,2011,'02 Jan 2011', 'ccc') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, city) VALUES (33,456,2010,'02 Jan 2011', 'ddd') 
INSERT INTO @sourceTable (number, amount, yr, modifiedDate, city) VALUES (22,456,2010,'02 Jan 2011', 'ddd') 

--Query 
INSERT INTO @destTable 
SELECT * FROM @sourceTable 
WHERE CAST(number AS NVARCHAR(100)) + '_' + CAST(amount AS NVARCHAR(100)) + '_' + CAST(yr AS NVARCHAR(100)) + '_' + CONVERT(NVARCHAR(100), modifiedDate,121) 
IN 
(
SELECT CAST(number AS NVARCHAR(100)) + '_' + CAST(amount AS NVARCHAR(100)) + '_' + CAST(yr AS NVARCHAR(100)) + '_' + CONVERT(NVARCHAR(100), MAX(modifiedDate),121) 
FROM @sourceTable 
GROUP BY number, amount, yr 
) 
--Results 
SELECT * FROM @destTable 
相關問題