将表格内容与外部文件SQL进行比较
我有一个带有用户ID的Excel文件,称为users Excel
。
在数据库中,我有一个users
表:该表保存用户excel文件和另一个文件(pipe理员文件)中的数据。
我想检查,如果我有一个用户在users Excel
中不存在的表中。
我应该build立一个虚拟表? 怎么样?
EXCEL方法
无需创build外部表格和加载等
最简单的方法是 –
- 将表格数据
SPOOL
到一个文件。 - 将此假脱机文件和
users Excel
的内容复制到一个公用文件。 - 只需使用
VLOOKUP
进行比较。
更新一些捷径 –
纯SQL方法
- 使用
excel string addition operator – &
生成SQL查询。
示例 –
="insert into customers values('" &B3 &"','" & C3 & "','"&D3&"');"
其中B3,C3,D3是指细胞。 在这里看到一个例子从Excel工作表生成SQL插入脚本
- 现在,只需在数据库中用所需的列
create
一个表。 - 复制并执行
INSERT
语句。 - 使用
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这样的一列/一行表并继续。
请评论,如果和作为调整/进一步的细节是必需的。