SQL выбрать из данных в запросе, где эти данные еще не в базе данных? - PullRequest
3 голосов
/ 05 апреля 2010

Я хочу проверить свою базу данных на наличие записей, которые я уже записал, прежде чем делать вызов веб-службы.

Вот как я представляю, как выглядит запрос, я просто не могу понять синтаксис.

SELECT * 
  FROM (1,2,3,4) as temp_table 
 WHERE temp_table.id 
LEFT JOIN table ON id IS NULL 

Есть ли способ сделать это? Как называется такой запрос?

Я хочу передать список идентификаторов в MySQL, и я хочу, чтобы он выплевывал идентификаторы, которых еще нет в базе данных?

Ответы [ 5 ]

2 голосов
/ 06 апреля 2010

Использование:

   SELECT x.id
     FROM (SELECT @param_1 AS id
             FROM DUAL
           UNION ALL
           SELECT @param_2
             FROM DUAL
           UNION ALL
           SELECT @param_3
             FROM DUAL
           UNION ALL
           SELECT @param_4
             FROM DUAL) x
LEFT JOIN TABLE t ON t.id = x.id
    WHERE x.id IS NULL

Если вам нужно поддерживать различное количество параметров, вы можете использовать:

1 голос
/ 06 апреля 2010

Чтобы подтвердить, что я правильно понял, вы хотите передать список чисел и посмотреть, какое из этих чисел не присутствует в существующей таблице? В действительности:

SELECT Item
FROM IDList I
    LEFT JOIN TABLE T ON I.Item=T.ID
WHERE T.ID IS NULL

Похоже, вы в порядке с созданием этого запроса на лету, и в этом случае вы можете сделать это с помощью таблицы цифр / подсчета, изменив приведенное выше значение на

SELECT Number
FROM (SELECT Number FROM Numbers WHERE Number IN (1,2,3,4)) I
    LEFT JOIN TABLE T ON I.Number=T.ID
WHERE T.ID IS NULL

Это относительно склонно к атакам SQL-инъекций, хотя из-за способа построения запроса. Было бы лучше, если бы вы могли передать '1,2,3,4' в виде строки и разбить ее на разделы, чтобы сгенерировать список номеров, к которому можно присоединиться более безопасным способом - пример того, как это сделать, см. http://www.sqlteam.com/article/parsing-csv-values-into-multiple-rows

Все это предполагает, что в вашей базе данных есть таблица чисел / счетчиков, но в целом они достаточно полезны, и я настоятельно рекомендую вам это сделать.

0 голосов
/ 06 апреля 2010

Как насчет вложенного запроса? Это может сработать. Если нет, это может привести вас в правильном направлении.

SELECT * FROM table WHERE id NOT IN (
        SELECT id FROM table WHERE 1
);
0 голосов
/ 06 апреля 2010

Я бы, наверное, просто сделал:

SELECT id
FROM table
WHERE id IN (1,2,3,4);

А затем обработайте список результатов, удалив все возвращенные запросом из списка «записей для отправки».

0 голосов
/ 06 апреля 2010
SELECT * FROM table where id NOT IN (1,2,3,4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...