Запрос на вставку, который не вставляет повторения и не накрутчивает счётчик

detail
Дата: 11.03.2008 05:57:20
Не подумал бы, что такое возможно сделать так просто... Но в конструкторе запросов Access 2003 это получилось! Объясните, кто может, как этот запрос работает, потому что я отказываюсь понимать это.

В общем, ситуация была такая: считываются данные из файлов, текстовые коды магазинов, и вставляются в таблицу. В таблице условие, что в поле "code" не могут повторяться значения. Если запустить запрос на вставку со значением, которое уже есть, то новая строка не появится, но счётчик будет увеличен на единицу (А поскольку записей несколько тысяч в неделю, он бежит вперёд с большой скоростью).

Нужно было сделать запрос на вставку с проверкой, что такого значения поля code нет в таблице. Я подумал про вложенный (select count(*) ...)=0. Оказалось, что можно вот так:

Задача

INSERT INTO shop (code)
SELECT [Y] AS newInput
FROM shop
HAVING [Y]=[code] AND Count(*)=0;

Этот SELECT работает! Если такой код уже есть в таблице, он выдаёт 0 строк, а если его нет - ровно одну. Я хочу понять, почему если такого кода в таблице нет, какие-то строки удовлетворяют условию [Y]=[code]!

таблица shop: id - counter, primary key; code - text(50), unique (индексированное поле, без повторений значений), not null
detail
Дата: 11.03.2008 07:16:53
Вот база с таблицей и запросом.
_restavraciya
Дата: 11.03.2008 07:38:57
> почему если такого кода в таблице нет, какие-то строки удовлетворяют условию [Y]=[code]!

Типа ответ:

Код (ваш случай когда [Y]=[code]) возвращает значение в зависимости от наличия записей в таблице:
SELECT 1 AS newInput
FROM shop
HAVING Count(*)=0 and true;

Код (ваш случай когда [Y]<>[code]) возвращает значение независимо от наличия записей в таблице:
SELECT 1 AS newInput
FROM shop
HAVING Count(*)=0 and false;

В этих примерах как бы все понятно кроме одного момента (мне)
На ЧТО накладывается условие FALSE/TRUE ?
Ведь если правильно понимаю хелп, то HAVING накладывает условие на группу
Если GROUP BY отсутствует то группой считается весь набор записей таблицы, а условие в HAVING относится к элементу по которому группируется.
К какому относится FALSE/TRUE ?
_restavraciya
Дата: 11.03.2008 07:51:01
Хорошо было бы посмотреть план этих запросов, но я не умею :-(
_restavraciya
Дата: 11.03.2008 08:28:49
Такой запрос всегда возвращает запись
SELECT 1 AS newInput
FROM shop
WHERE false
HAVING Count(*)=0  and true;

Чтото у них с планом ;-)
_restavraciya
Дата: 11.03.2008 08:39:00
Ступил. :-/
Этот пример == первому примеру на пустом наборе
бубубу
Дата: 11.03.2008 09:00:17
detail
.....................Если запустить запрос на вставку со значением, которое уже есть, то новая строка не появится, но счётчик будет увеличен на единицу (А поскольку записей несколько тысяч в неделю, он бежит вперёд с большой скоростью).........


[off topic]
На всякий случай: нарушена седьмая заповедь из десяти заповедей Аксесса

а как посмотреть план запроса здесь
[/off topic]
detail
Дата: 11.03.2008 14:15:17
Улыбнули заповеди. Я ещё пару из них нарушаю.