2016-06-13 57 views
0

我對使用SQL還是一個​​新東西,這個查詢讓我特別被困住了。使用臨時表來查詢和更新現有表

我正在導入一個.CSV文件到一個臨時表(它只有一列寬,它導入罰款,除了第一行,由於某些原因空白),以更新現有數據庫中的表匹配導入的列。

我遇到的問題是它只匹配導入表中的最後一個條目,並且只更新現有表中的1條記錄。 .CSV文件是從一個傳播生成的,而這個傳播是從現有數據庫的查詢生成的,所以我知道這些名稱是正確的,它們在臨時表中。

我已經看到了幾個類似的查詢問題/解決方案,並試圖使用他們的解決方案的部分無濟於事,希望這個社區可以幫助我!

if object_id('dbo.namefile', 'u') is not null 
    drop table dbo.namefile 

create table dbo.namefile 
(
    name varchar(255) not null primary key 
    --constraint pk_t1_name check(name not like 'zzzzzzz') 
) 

bulk insert dbo.namefile 
from 'f:\list.csv' 
with (datafiletype = 'char', 
     fieldterminator = '","', 
     rowterminator = '\r', 
     errorfile = 'f:\inp_err.log') 

update dbo.MeasurementLimit 
set LowLimit = 1 
from namefile as nf 
join EntityName as en on en.EntityName = nf.name 
join MeasurementLimit as ml on en.uid = ml.UID 
where en.EntityName = nf.name 

感謝所有幫助

我想這一點,今天早上

select * from namefile 

它返回113記錄在list.csv文件

但是,這僅條目的正確數量返回1條記錄

select * from namefile nf 
inner join Entityname as en on en.Entityname = nf.listname 

Entityname table

Measurementlist

+0

這是'MySQL'還是'SQL Server'?他們不是一回事。 – Siyual

+0

SQL Server 2014 ..對不起.. – Mitch201

+0

SQL Server 2014 ..對不起.... namefile表只是一個需要更改或更新的名稱列表。它使用entityname表中的entityname列標識(見圖片),然後使用uid列標識測量列表uid列以標識我想要更新該樣本中下限的特定字段(請參見圖片)我期望發生的事情如果temp表中的名稱與entityname表中的名稱相匹配,則它將更新下限到「1」,以便爲temp表中列出的所有名稱關聯名稱。 – Mitch201

回答

0

的解決辦法是在批量插入..原代碼(上圖)將在讀一列的CSV文件,但它也增加了一個空白記錄到搞砸了任何查詢表你會反對它修正的插入代碼是

bulk insert namefile 
from 'f:\list.csv' 
( 
datafiletype = 'char', 
fieldterminator = ',', <========= This was wrong 
rowterminator = '\n',<====== and this was wrong 
errorfile = 'f:\inp_err.log' 
); 
0

我的猜測是,問題是,你是不是使用了update的別名。這個怎麼樣版:

update ml 
    set LowLimit = 1 
from namefile as nf join 
    EntityName as en 
    on en.EntityName = nf.name join 
    MeasurementLimit as ml 
    on en.uid = ml.UID 
where en.EntityName = nf.name; 
+0

即使只做一個簡單的選擇,也只給我一條記錄,名稱文件表中有113條記錄(請參閱上面添加的編輯) – Mitch201