我有一个带有用户ID的Excel文件,名为users Excel
。
在数据库中,我有一个users
表:该表包含来自用户excel文件和另一个文件(管理员文件)的数据。
我想检查表格中不存在的users Excel
中是否有用户。
我应该构建一个虚拟表吗?如何?
答案 0 :(得分:2)
EXCEL方法
无需创建外部表格和加载等。
最简单的方法是 -
SPOOL
表数据到文件。 users Excel
的内容复制到公用文件中。VLOOKUP
进行比较。更新更多短片 -
纯SQL方法
excel string addition operator – &
生成SQL查询。 示例 -
="insert into customers values('" &B3 &"','" & C3 & "','"&D3&"');"
其中B3,C3,D3是指细胞。请在此处查看示例Generate sql insert script from excel worksheet
create
数据库中包含所需列的表。INSERT
语句。MINUS
查询比较两个表。例如,
select user from db_table
MINUS
select user from excel_table
答案 1 :(得分:1)
您可以将Excel文件内容加载到临时表中,并将内容与现有表进行比较。
我猜你是在Windows环境中:
1-将excel文件的内容导出到简单文本文件(users.txt)
2-创建临时表: CREATE TEMPORARY TABLE users_tmp(user_id int)ENGINE = MEMORY;
3-将数据文件内容加载到tmp表: LOAD DATA LOCAL INFILE'users.txt'INTO TABLE users_tmp LINES TESINATED BY'\ r \ n';
然后将用户与users_tmp内容进行比较。
答案 2 :(得分:1)
是的,您可以尝试创建具有语法CREATE TEMPORARY TABLE temp_users(user_id INT)
的虚拟/临时表。
将users Excel
数据推入其中。
然后通过编写查询来比较users
表和temp_users
。
答案 3 :(得分:1)
你列出了几个数据库而没有特定的版本......在任何情况下,你都需要生成适当的SELECT
- 在Lalit Kumar B建议的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;
在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
;
在更新的版本中,您可以选择因子:
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
;
如果某个数据库不像MySQL那样放松(SELECT
中不需要表),并且没有Oracle的“DUAL”等效数据库,您仍然可以创建这样的一列/一行表并继续
如果需要调整/进一步详细说明,请发表评论。