Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 插入(不包括第二个),从现有记录中添加第一个_Sql Server 2005_Tsql_Bulkinsert - Fatal编程技术网

Sql server 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语句进行大容量插入。(背景信息:我正在使用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 .. ..
....
无此记录:(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
。在没有其他排序标准的情况下,它们的特定顺序将是任意的。