2012-01-10 12 views
4

私の解決策よりも効率的な方法を探したい。だからここに問題があります: 私はselect文から一括挿入をしたいと思います。結果は、先に2番目を除いて挿入、既存のレコードから最初のレコードを追加する

... 
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 .. .. 
.... 

です

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

もしそうなら、私は持っていたい:選択の

例:(背景情報私は、MSSQL 2005を使用しています)

... 
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アムステルダム)

これらの2つのうちの最初のものを宛先テーブルに挿入したいとします。私は、挿入されるべきである選択から出てくる他のレコードも持っています。ですから、この場合、最初のものを取りに行きたいと思います。数字、量、年はmodifiedDate DESCによって同じ順序です。それが私がしたいことです。私はすでにCursorを使って解決策を作りましたが、もっと良い方法があるはずです。

+0

これは十分な情報ではないと私は考えています。あなたが行っていることを正確に見るためにカーソルを表示してください。 –

+1

私がカーソルを掲示しないのは、別の解決策を探しているからです。カーソルで私はすでに答えがあります。私は別の方法があるのだろうかと思います。クエリ全体を投稿しない理由は、それが非常に複雑なためですが、基本的にはその考え方です。私は今明白でなければならないと思う。まだ不明な点がある場合は教えてください。 – Ekaterina

+0

これらの2つの行の間に、どのように最初のものを第2のものからどうやって伝えますか?あなたは 'modifiedDate'によって行を注文していますが、それらの2つのものは同じ' modifiedDate'値を持っています。それらの特定の順序は、他のソーティング基準がない場合は任意です。 –

答えて

1

あなたが正しくしようとしていることを理解している場合は、最初の3つの列をグループ化し、modifiedDate列からMAXの値を選択する必要があると思います。

私が誤解しているかどうか教えてください。

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

あなたはまた、クエリのINSERT一部のヘルプを探しているなら、あなたは現在、そこにやっていることについての詳細を記入してください。

+0

ええ、私の説明は確かに正確ではありませんでした。ダミーの列をいくつか追加しました。元の選択は、同じではない列と多くの列でより複雑になります。私はwhere句でいくつかのグループ化を試みましたが、私はまだ私が望むものを得ることはできませんでした。 – Ekaterina

+0

可能であれば、必ずフルコードを投稿してください。そうすれば、たとえ人が理解するのに時間がかかっても、本当に必要な答えを得ることができます!私の答えはあまり役に立たないと思いますか? –

+0

本当に、わかりやすくしたいと思っていましたが、そうではないと思います。いいえ、あなたの答えは私が探しているものではありません。あなたは考えがありますか?カーソル以外? – Ekaterina

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

+0

宛先テーブルのテーブル定義を教えてもらえますか? – Mack

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 
関連する問題