2012-01-10 2 views
4

내 솔루션보다 효율적인 방법을 찾고 싶습니다. 그래서 여기에 문제가 있습니다 : select 문에서 대량 삽입을 원합니다. 결과는 대상에서두 번째 제외 삽입, 기존 레코드에서 첫 번째 추가

... 
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 암스테르담)

대상 테이블에이 두 가지 중에서 첫 번째를 삽입하고 싶습니다. 삽입해야하는 선택에서 나오는 다른 레코드가 있습니다. 그래서 이번에는 modifiedDate DESC에 의해 number, amount, year가 같은 순서 인 첫 번째 것을 가져 가고 싶습니다. 그것이 내가하고 싶은 일입니다. 이미 Cursor를 사용하여 솔루션을 만들었지 만 더 나은 방법이 있어야합니다.

+0

여전히 충분한 정보라고 생각하지 않습니다. 자신이하고있는 것을 정확히 볼 수 있도록 커서를 보여주십시오. –

+1

커서를 게시하지 않는 이유는 다른 솔루션을 찾고 있기 때문입니다. 커서로 나는 이미 대답을 가지고있다. 다른 방법이 있는지 궁금합니다. 전체 쿼리를 게시하지 않는 이유는 매우 복잡하기 때문에 기본적으로 생각입니다. 이제는 분명해야한다고 생각합니다. 아직도 불분명한지 알려주십시오. – Ekaterina

+0

두 행 사이에 두 번째 행에서 첫 번째 행을 어떻게 말합니까? 당신은'modifiedDate'에 의해 행을 정렬하지만, 그 두 가지는 동일한'modifiedDate' 값을가집니다. 다른 정렬 기준이없는 경우에는 특정 순서가 임의적입니다. –

답변

1

내가 올바르게하려는 것을 이해한다면 처음 세 개의 열을 그룹화하고 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 
관련 문제