2015-01-08 3 views
1

У меня есть файл Excel с идентификаторами пользователей, который называется users Excel.Сравнение содержимого таблицы с внешним файлом-SQL

В базе данных у меня есть таблица users: в этой таблице хранятся данные из файла excel пользователей и из другого файла (файл администраторов).

Я хотел бы проверить, есть ли у меня пользователь в users Excel, которого нет в таблице.

Должен ли я построить виртуальную таблицу? как?

+1

Почему у вас есть ** несколько тегов DB **? –

ответ

1

Вы можете загрузить содержимое файла Excel во временную таблицу и сравнить содержимое с существующей таблицей.

Я думаю, вы на окна среды:

1- Экспорт содержание файла Excel в простой текстовый файл (users.txt)

2- Создайте временную таблицу: ВРЕМЕННОЕ СОЗДАТЬ TABLE users_tmp (user_id int) ENGINE = MEMORY;

3 Загрузите содержимое файла данных в таблицу tmp: LOAD DATA LOCAL INFILE 'users.txt' INTO TABLE users_tmp ЛИНИИ, ПРЕРЫВАННЫЕ '\ r \ n';

Затем сравните пользователей с контентом users_tmp.

+0

Спасибо, как я могу удалить временную таблицу после использования? – user3165438

+0

Вы можете просто использовать «DROP TABLE ...». Также обратите внимание, что временная таблица видна только для текущего соединения, она автоматически отбрасывается, если вы закрываете соединение. –

1

Да, вы можете попробовать создать виртуальную/временную таблицу с синтаксисом CREATE TEMPORARY TABLE temp_users(user_id INT).

Вставьте данные users Excel.

Затем сравните users стол с temp_users путем написания запроса.

+0

Как удалить временную таблицу после использования? – user3165438

2

метод EXCEL

Нет необходимости создания внешних таблиц и загрузки и т.д.

Самый простой способ будет -

  1. SPOOL табличные данные в файл.
  2. Скопируйте содержимое этого буферизованного файла и вашего users Excel в обычный файл.
  3. Просто сравните, используя VLOOKUP.

UPDATE Некоторые более короткие пути -

Чистый метод SQL

  1. Генерация запросов SQL с помощью excel string addition operator – &.

Пример -

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

, где B3, C3, D3, относятся к клеткам. См. Пример здесь Generate sql insert script from excel worksheet

  1. Теперь только create таблица в вашей базе данных с необходимыми столбцами.
  2. Скопируйте и выполните инструкции INSERT.
  3. Сравните две таблицы, используя запрос MINUS.

Например,

select user from db_table 
MINUS 
select user from excel_table 
+0

'Спасибо. Это хорошая идея. но я все равно хотел бы сделать это через запрос. – user3165438

+0

Я расскажу вам небольшой секрет. Вы можете напрямую создавать инструкции 'INSERT' на листе' EXCEL'. Все, что вам нужно сделать, это просто создать таблицу с столбцом «USER». И выполните все инструкции 'insert'. А затем простой запрос «MINUS» для сравнения. Позвольте мне отредактировать мой ответ и добавить это. –

+0

См. Мое обновление в ответе. –

1

Вы перечислили несколько баз данных и нет конкретной версии ... В любом случае, вам нужно будет генерировать соответствующие SELECT с - либо в Excel, как было предложено Lalit Kumar B, используя некоторые текстовый процессор или даже (частично) в вашей базе данных.

Для MySQL вы должны работать с инструкциями, которые будут использоваться в подзапросе, что приведет к «Т».

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, чтобы сравнить с таблицей пользователей, вы, вероятно, использовать один из более сложных подходов 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, вы можете создать такую ​​таблицу с одним столбцом/одной строкой и продолжить.

Прокомментируйте, если и как требуется дополнительная настройка/дальнейшая информация.

Смежные вопросы