是否可以通过匹配某个列来更新.csv文件中SQL表中的列?

gudnpqoy  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(117)

是否可以通过匹配某个列,使用csv文件中的值更新SQL表中的列?
举例来说:
假设需要更新的表如下所示:

| Name    | Email|
| ------- | ---- |
| John    |      |
| Elroy   |      |
| Tim     |      |

字符串
然后,包含需要从中获取的值的.csv文件看起来像这样:

| Name   | Email            |
| ------ | ---------------- |
| Elroy  | elroy@domain.com |
|  John  | john@gmail.com   |
| Tim    | tim@domain.co.uk |


因此,需要遍历csv文件,在Name列中的值匹配的地方,使用相应的值更新SQL表中的Email列。有没有一种方法可以实现这一点,也许可以使用phpMyAdmin的UI?
这就是我要做的,但我不一定要将它们合并在一起,而不是更新值

SELECT
 *
  FROM left l
   LEFT JOIN right r
    ON l.name = r.name;

zour9fqk

zour9fqk1#

不需要。但是导入数据并使用一个表的内容更新另一个表并不太困难。
你可能会受益于潜入SSIS,有一个ui可以做这样的事情:https://learn.microsoft.com/en-us/sql/integration-services/sql-server-integration-services?view=sql-server-ver16
所以,但如果你不喜欢UI,我建议先加载文件,然后du和更新与导入的数据和您的目的地之间的地方。例如下面的例子。
就我个人而言,我会使用像C#这样的高级编程语言,以便能够更好地控制边缘情况并给予ui,因为我们很可能想要告诉某人数据是否是垃圾。
如果我被迫只使用TSQL,那么下面是一些沿着的东西。
使用TSQL的示例:要从T-SQL将CSV文件加载到表中,可以使用BULK INSERT语句。下面是一个例子:
在SQL Server数据库中创建与CSV文件结构匹配的表。

CREATE TABLE MyTable (
    ID INT,
    Name VARCHAR(50),
    Age INT
);

字符串
确保CSV文件存在并且可以从SQL Server示例访问。您可能需要将文件放置在SQL Server可以访问的位置。
使用BULKINSERT语句将CSV数据加载到表中。下面是一个例子:

BULK INSERT MyTable
FROM 'C:\path\to\your\file.csv'
WITH (
    FIRSTROW = 2,  -- Skip the header row if present
    FIELDTERMINATOR = ',',  -- Specify the field delimiter
    ROWTERMINATOR = '\n'  -- Specify the row terminator
);


在此示例中,将“C:\path\to\your\file.csv”替换为CSV文件的实际路径。根据CSV文件的结构调整FIELDTERMINATOR和ROWTERMINATOR选项。FIRSTROW选项用于跳过标题行(如果存在)。
执行BULKINSERT语句后,CSV文件中的数据将加载到数据库中的MyTable表中。确保您具有执行BULK INSERT语句和访问文件位置所需的权限。此外,请确保表中的列顺序和数据类型与CSV文件的结构匹配。
如果有两张table的话剩下的就不重要了吧?如果没有做评论,我很乐意分享
// update:添加了一个使用元素的实现
所以很明显,一旦你在导入表中有了数据,你就可以应用任何你想要更新的范例,这里我选择如果在导入中存在,我必须更新,如果是新的,我将添加,如果不是,我将离开。
显然,transact sql真的很旧,很笨重,所以基本上你可以有一个锤子和钉子,所以这将不得不做的一切,不是很漂亮,显然应该升级与索引肯定,但在快速草案可能是:

IF NOT EXISTS(SELECT * FROM sys.tables WHERE name = 'PeopleTable')
BEGIN
 CREATE TABLE PeopleTable(
    Name NVARCHAR(25),
    Email NVARCHAR (60)
 );
END

IF EXISTS(SELECT * FROM sys.tables WHERE name = 'PeopleTableImport')
BEGIN
    DROP TABLE PeopleTableImport;
end
CREATE TABLE PeopleTableImport(
    Name NVARCHAR(25),
    Email NVARCHAR (60)
    );

BULK INSERT dbo.PeopleTableImport
FROM 'C:\path\to\your\file.csv'
WITH (
    FIRSTROW = 1,  -- Skip the header row if present
    FIELDTERMINATOR = ',',  -- Specify the field delimiter
    ROWTERMINATOR = '\n'  -- Specify the row terminator
);
DECLARE @active table( 
    [Name] NVARCHAR(25)
    )
-- some update logics
--Already existing must be fine in newest form
INSERT INTO @active
(
    Name
)
(SELECT [name] FROM dbo.PeopleTable WHERE name IN (SELECT [Name] FROM dbo.PeopleTableImport))

DELETE FROM dbo.PeopleTable WHERE Name IN (SELECT name FROM @active)

INSERT INTO dbo.PeopleTable
(
    Name,
    Email
)
(SELECT [Name], Email FROM dbo.PeopleTableImport x WHERE exists (SELECT y.Name FROM @active y WHERE y.Name = x.Name ))

-- then the new ones
INSERT INTO dbo.PeopleTable
(
    Name,
    Email
)
(SELECT [Name], Email FROM dbo.PeopleTableImport x WHERE NOT EXISTS (SELECT y.Name FROM @active y WHERE y.Name = x.Name ))

相关问题