Sql server 2005 插入(不包括第二个),从现有记录中添加第一个
我想找到比我的解决方案更有效的方法。问题是: 我想从select语句进行大容量插入。(背景信息:我正在使用MSSQL 2005) 选择的示例:Sql server 2005 插入(不包括第二个),从现有记录中添加第一个,sql-server-2005,tsql,bulkinsert,Sql Server 2005,Tsql,Bulkinsert,我想找到比我的解决方案更有效的方法。问题是: 我想从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
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 .. ..
....
无此记录:(1100 2011 01-01-2011 2阿姆斯特丹)
我想在目标表中插入这两个表中的第一个。我有其他记录出来的选择,应插入以及。因此,在本例中,我想取第一个,其中数字、金额和年份由modifiedDate DESC按相同顺序排列。这就是我想做的。我已经用游标做了一个解决方案,但应该有更好的方法 如果我理解您试图正确执行的操作,我认为您需要对前三列进行分组,并从
modifiedDate
列中选择MAX
值
如果我误解了,请告诉我
SELECT
number,
amount,
year,
MAX(modifiedDate)
FROM
X
GROUP BY
number, amount, year
如果您也在查询的
插入部分寻求帮助,请提供有关您当前正在执行的操作的更多详细信息。按所有列分组将实现此目的
例如:
--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
这将使您更接近您所需要的:
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
谢谢你的回复。我得到了一个不同的想法,它比旧的时尚光标快得多,我认为它符合我所寻找的,所以我也在这里分享它
--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
是的,我的解释确实不太准确。我添加了一些虚拟列。原始的select更为复杂,有许多不同的列,下面还有一些连接。我确实在where子句中尝试了一些分组,但是我仍然没有得到我想要的。在可行的情况下,您应该始终发布完整的代码。这样你就更有可能得到你真正需要的答案,即使人们需要更长的时间才能理解!我想我的答案没有多大帮助?是的,我想让它更容易理解,但我想事实并非如此。不,你的答案不是我想要的。你有什么想法吗?除了游标之外?@Ekatarina:如果您再添加几行示例输入和预期的输出,我们应该能清楚地看到。@Ekatarina:您可能正在寻找某种形式的递归……请尝试常见的表表达式。这不是我想要的。我对我的问题做了一点修改,因为它有误导性。我有一个巨大的select,因此group by不能这样工作。你能给我们目标表的表定义吗?我仍然认为这是不够的信息。请显示您的光标,以便我们能够准确地看到您正在做什么。我之所以不发布光标,是因为我正在寻找其他解决方案。我已经有答案了。我不知道还有没有别的办法。我之所以不发布整个查询,是因为它非常复杂,但基本上就是这样。我认为现在应该明确。如果还不清楚,请告诉我。在这两行之间,你如何区分第一行和第二行?您正在按modifiedDate
对行进行排序,但这两个值是相同的modifiedDate
。在没有其他排序标准的情况下,它们的特定顺序将是任意的。