[ОТВЕТИТЬ]
Опции темы
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:00.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.