Подскажите куда копать?
Есть таблица с шапками документов - SUPERMAG.SERJ (ID документа и пара доп признаков)
Надо к каждому документу подтянуть спецификацию документа SMSpec, налоги SMSpecTax, карточка товара SMCard, себестоимость FFMapRep и при этом отфильтровать артикулы по условию принадлежности к каким то группам.
Когда у интересующих групп вложимость в дереве классификатора была одинаковая, использовалась конструкция следующего вида, и всё работало на ура: (запрос показывает все артикулы для документа БР420120101@45, за исключением групп '6789', '7891', '9400', '9402')
select * from
SUPERMAG.SERJ serj
left join SUPERMAG.FFMapRep f on f.SALEID=serj.ID
left join SUPERMAG.smspectax tax on f.SALEID=tax.DOCID and f.SALETYPE=tax.DOCTYPE and f.SALESPECITEM=tax.SPECITEM
where
(select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 10)
where ARTICLE=f.article
) not in ('6789', '7891', '9400', '9402')
and
serj.id = 'БР420120101@45'
Но потом понадобилось производить эти выборки для нескольких групп товаров с разной вложимостью дерева классификатора.
select * from SUPERMAG.SERJ serj
left join SUPERMAG.FFMapRep f on f.SALEID=serj.ID
left join SUPERMAG.smspectax tax on f.SALEID=tax.DOCID and f.SALETYPE=tax.DOCTYPE and f.SALESPECITEM=tax.SPECITEM
where
(select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 9)
where ARTICLE=f.article
)!='9092'
and
(select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 10)
where ARTICLE=f.article
) not in ('6789', '7891', '9400', '9402')
and
(select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 11)
where ARTICLE=f.article
) not in ('10093', '10095')
and
serj.id = 'БР420120101@45'
Это я думал, что если добавить ещё одно условие (select ...) not in ('xxx'), то всё будет как обычно. Но оказалось если в WHERE присутствуют два и более условия такого типа, соединённых AND'ом весь select возвращает погоду.
Т.е. в первом случае у меня все артикулы документа БР420120101@45, не принадлежащие группам '6789', '7891', '9400', '9402'. А во втором случае хотелось что бы все артикулы кроме уже 7-ти групп, но на выходе две записи и ни каких ошибок. При этом точно известно, что этих артикулов должно быть очень много.
Причём если наоборот нужно получить из документа артикулы, которые принадлежат группам, заменяем условия и AND на OR, объединяем скобочками и работает правильно.
where
((select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 9)
where ARTICLE=f.article
)='9092'
or
(select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 10)
where ARTICLE=f.article
) in ('6789', '7891', '9400', '9402')
or
(select ts.id from SUPERMAG.SMCARD c
left join SUPERMAG.sacardclass t on t.ID=c.IDCLASS
left join SUPERMAG.SACARDCLASS ts on ts.TREE=SUBSTR(t.TREE,0, 11)
where ARTICLE=f.article
) in ('10093', '10095')
)
and
serj.id = 'БР420120101@45'
Подскажите как можно выкрутиться в этой ситуации ? Как ещё можно фильтровать по нескольким группам ?
Oracle Enterprise 10.2.0.4.0