13.07.2009 18:22
Pyatak
 
Есть таблица с составным ключом (3 поля),
есть другая таблица, в которой есть ссылка на записи из первой.
Как более корректно проверить, есть ли во второй таблице ссылки на не существующие записи первой, чем тут:
Код:
SELECT *
FROM supermag.smspecrlbase
WHERE CONCAT(CONCAT(basedocid,basedoctype),basespecitem) NOT IN 
  (SELECT CONCAT(CONCAT(docid,doctype),specitem) FROM supermag.smspec)
?
13.07.2009 19:45
MirProd
 
Вот так будет быстрее:
Код:
SELECT *
FROM supermag.smspecrlbases t1 
LEFT JOIN supermag.smspec t2
ON CONCAT(CONCAT(t1.basedocid, t1.basedoctype), t1.basespecitem) = CONCAT(CONCAT(t2.docid, t2.doctype), t2.specitem)
WHERE t2.docid IS NULL
14.07.2009 10:44
Pyatak
 
А без использования CONCAT тоже самое возможно?
14.07.2009 10:48
Mtirt
 
Такой вариант устроит?

Цитата:
select * from supermag.smspecrlbases where (doctype, docid, specitem) in
(select t.doctype, t.docid, t.specitem from supermag.smspecrlbases t
minus
select a.doctype, a.docid, a.specitem from supermag.smspec a)
14.07.2009 10:58
Mtirt
 
Не права я, я тебе немного другое привела - отбор записей из первой таблицы, которых нет во второй.
А то, что тебе надо, выглядит так:
Цитата:
SELECT *
FROM supermag.smspecrlbases t1, supermag.smspec t2
where t1.basedocid=t2.docid and t1.doctype=t2.doctype and t1.specitem=t2.specitem
and t2.docid IS NULL
14.07.2009 11:19
Pyatak
 
Спасибо, ага, так уже лучше, хотя такой запрос значительно дольше выполнялся чем предыдущий.
14.07.2009 11:27
Mtirt
 
А он хоть что-то отбирает?
Потому как я засомневалась...
Так как объединение по полю, значение которого null по-хорошему работать не должно.
14.07.2009 12:26
Pyatak
 
Нет, но у меня это подозрений не вызвало, так как таблица supermag.smspecrlbases у меня пуста. В ней было всего несколько записей, которые ссылались на не существующие записи в smspec, что мешало включению констрейна SMCSPECRLBASES_BASE (см. соседнюю тему про ORA-01000). Вот я их и удалил. Выяснить почему так получилось нет возможности, эти записи были от сличительной ведомости от 2005-го года.
14.07.2009 15:47
reddevil
 
Цитата:
Pyatak Нет, но у меня это подозрений не вызвало, так как таблица supermag.smspecrlbases у меня пуста. В ней было всего несколько записей, которые ссылались на не существующие записи в smspec, что мешало включению констрейна SMCSPECRLBASES_BASE (см. соседнюю тему про ORA-01000). Вот я их и удалил. Выяснить почему так получилось нет возможности, эти записи были от сличительной ведомости от 2005-го года.
На будущее
15.07.2009 00:32
MirProd
 
Цитата:
Pyatak А без использования CONCAT тоже самое возможно?
Код:
SELECT *
FROM supermag.smspecrlbases t1, supermag.smspec t2
where t1.basedocid=t2.docid(+) and t1.basedoctype=t2.doctype(+) and t1.basespecitem=t2.specitem(+)
and t2.docid IS NULL
Часовой пояс GMT +3, время: 07:53.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.