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

时间:2015-01-08 09:16:03

标签: mysql sql excel oracle db2

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

在数据库中,我有一个users表:该表包含来自用户excel文件和另一个文件(管理员文件)的数据。

我想检查表格中不存在的users Excel中是否有用户。

我应该构建一个虚拟表吗?如何?

4 个答案:

答案 0 :(得分:2)

EXCEL方法

无需创建外部表格和加载等。

最简单的方法是 -

  1. SPOOL表数据到文件。
  2. 将此假脱机文件和users Excel的内容复制到公用文件中。
  3. 只需使用VLOOKUP进行比较。
  4. 更新更多短片 -

    纯SQL方法

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

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

      其中B3,C3,D3是指细胞。请在此处查看示例Generate sql insert script from excel worksheet

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

        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;

SQL Fiddle

在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
;

SQL Fiddle

如果某个数据库不像MySQL那样放松(SELECT中不需要表),并且没有Oracle的“DUAL”等效数据库,您仍然可以创建这样的一列/一行表并继续

如果需要调整/进一步详细说明,请发表评论。