将表格内容与外部文件SQL进行比较

我有一个带有用户ID的Excel文件,称为users Excel

在数据库中,我有一个users表:该表保存用户excel文件和另一个文件(pipe理员文件)中的数据。

我想检查,如果我有一个用户在users Excel中不存在的表中。

我应该build立一个虚拟表? 怎么样?

EXCEL方法

无需创build外部表格和加载等

最简单的方法是 –

  1. 将表格数据SPOOL到一个文件。
  2. 将此假脱机文件和users Excel的内容复制到一个公用文件。
  3. 只需使用VLOOKUP进行比较。

更新一些捷径 –

纯SQL方法

  1. 使用excel string addition operator – &生成SQL查询。

示例 –

="insert into customers values('" &B3 &"','" & C3 & "','"&D3&"');"

其中B3,C3,D3是指细胞。 在这里看到一个例子从Excel工作表生成SQL插入脚本

  1. 现在,只需在数据库中用所需的列create一个表。
  2. 复制并执行INSERT语句。
  3. 使用MINUS查询比较两个表。

例如,

 select user from db_table MINUS select user from excel_table 

您可以将Excel文件内容加载到临时表中,并将内容与现有表进行比较。

我想你是在一个Windows环境:

1-将excel文件的内容导出到一个简单的文本文件(users.txt)

2-创build临时表:CREATE TEMPORARY TABLE users_tmp(user_id int)ENGINE = MEMORY;

将数据文件内容加载到tmp表中:LOAD DATA LOCAL INFILE'users.txt'INTO TABLE users_tmp LINES TERMINATED BY'\ r \ n';

然后将用户与users_tmp内容进行比较。

是的,您可以通过创build具有语法CREATE TEMPORARY TABLE temp_users(user_id INT)虚拟/临时表来尝试。

users Excel数据推送到它。

然后通过编写查询将users表与temp_users进行比较。

您列出了几个数据库,并没有特定的版本…无论如何,您将需要生成适当的SELECT – 在Lalit Kumar Bbuild议的Excel中,使用一些文本处理器,甚至(部分)在您的数据库中。

对于MySQL,你可以使用子查询中使用的语句来产生“T”。

 SELECT T.firstName, T.lastName FROM (SELECT 'Afirst' firstName, 'Alast' lastName UNION ALL SELECT 'Dfirst' firstName, 'Dlast') T LEFT JOIN Users U ON U.firstName = T.firstName AND U.lastName = T.lastName WHERE U.firstName IS NULL AND U.lastName IS NULL; 

SQL小提琴

在Oracle中,您使用DUAL构造语句:

 SELECT T.firstName, T.lastName FROM (SELECT 'Afirst' firstName, 'Alast' lastName FROM DUAL UNION ALL SELECT 'Dfirst' firstName, 'Dlast' FROM DUAL) T LEFT JOIN Users U ON U.firstName = T.firstName AND U.lastName = T.lastName WHERE U.firstName IS NULL AND U.lastName IS NULL ; 

在更新的版本中,您可以select以下因素:

 WITH T (firstName, lastName) AS ( SELECT 'Afirst' firstName, 'Alast' lastName FROM DUAL UNION ALL SELECT 'Dfirst' firstName, 'Dlast' FROM DUAL ) SELECT T.firstName, T.lastName FROM T LEFT JOIN Users U ON U.firstName = T.firstName AND U.lastName = T.lastName WHERE U.firstName IS NULL AND U.lastName IS NULL ; 

甚至可以拆分数据库中的列(如果您的Excel中有两个或三个以上的列与Users表进行比较,则可能使用更复杂的CSV分割方法之一 – 如果您的Oracle版本允许。):

 WITH T (string) AS ( SELECT 'Afirst,Alast' FROM DUAL UNION ALL SELECT 'Dfirst,Dlast' FROM DUAL ), TUser (firstName, lastName) AS ( SELECT SUBSTR(string, 1, INSTR(string, ',') - 1) , SUBSTR(string, INSTR(string, ',') + 1, LENGTH(string)) FROM T ) SELECT T.firstName, T.lastName FROM TUser T LEFT JOIN Users U ON U.firstName = T.firstName AND U.lastName = T.lastName WHERE U.firstName IS NULL AND U.lastName IS NULL ; 

SQL小提琴

如果某个数据库不像MySQL那样宽松(在SELECT不需要表),并且没有Oracle的“DUAL”等价物,那么仍然可以创build这样的一列/一行表并继续。

请评论,如果和作为调整/进一步的细节是必需的。