Forum Webscript.Ru

Общие => Базы данных => Тема начата: new_coder от 30 Ноября 2007, 16:38:07

Название: составление запроса
Отправлено: new_coder от 30 Ноября 2007, 16:38:07
есть одинаковые структуры хранящиеся в двух таблицах

table1
   code
   name

table2
   code
   name

как из table1 выбрать строки которых нет в table2 (определяю по code)

немогу составить запрос.
Название: составление запроса
Отправлено: for_i_0 от 30 Ноября 2007, 17:29:43
Вариант:


SELECT * FROM  `table1` WHERE `code` NOT IN (SELECT `code` FROM `table2`)
Название: составление запроса
Отправлено: ravshaniy от 01 Декабря 2007, 00:46:55
[eq, у меня тоже есть вариант )))

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

SELECT * FROM (
   SELECT t1.*,  t2.`name` as t2_name
   FROM  `table1`t1 LEFT JOIN `table2` t2 USING (`code`)
) tt
WHERE tt.t2_name IS NULL


не пробывал конешно, но должно сработать ))

а по другому это так:


SELECT * FROM table1
WHERE code NOT IN (
   SELECT code
   FROM  `table1` t1 INNER JOIN `table2` t2
            USING (`code`, `name`)
)
Название: составление запроса
Отправлено: Altaxar от 01 Декабря 2007, 16:18:28
for_i_0
Решение правильное,
но ошибочное при большой базе данных, выдаст переполнение памяти.

можно так:
SELECT * FROM table1 t1
WHERE (
   SELECT 1
   FROM  table2 t2 where t2.code=t1.code limit 1
) is null
но это долгий вариант.
Название: составление запроса
Отправлено: ravshaniy от 02 Декабря 2007, 16:20:42
Цитировать
Altaxar:
for_i_0
Решение правильное,
но ошибочное

вобще сильно сказано )))))

честно говоря даже не понял как будет проходить ваш запрос - план запроса каков? интересно?
Название: составление запроса
Отправлено: Altaxar от 02 Декабря 2007, 22:47:17
ravshaniy
запрос for_i_0 имеет недостаток в большой базе данных, под запрос вернет список code  в виде массива, что и может создать ошибку при большой обьеме данных.
Мой метод возвращает 1 если есть в таблицы table2 code и если нету то null по этому признаку из первой таблицы и выводится результат.
я не проверял, но принцип такой.
Название: составление запроса
Отправлено: ravshaniy от 03 Декабря 2007, 12:16:25
Цитировать
Altaxar:
Мой метод возвращает 1 если есть в таблицы table2 code и если нету то null по этому признаку из первой таблицы и выводится результат.

вы знаете там в корне все не правильно

видите ли сначала будет исполняться подзапрос

Цитировать
Altaxar:
SELECT 1
FROM table2 t2 where t2.code=t1.code limit 1

и он обязательно ругнется на t1, потому что он не знает что такое t1. подзапрос он совсем не связан с запросом в целом.

опять же я не тестирую, но думаю я прав.

помоему нам уже нужно начать тестировать )))
Название: составление запроса
Отправлено: hanslinger от 03 Декабря 2007, 12:39:57
Ты бы сначала проверил, а потом выступал.
Работает даже такое:
UPDATE a SET a.x = (SELECT COUNT(b.id) FROM b WHERE b.y = a.z)
Название: составление запроса
Отправлено: ravshaniy от 03 Декабря 2007, 13:23:42
нда работает кстати. не прав прошу прощения