Если вам нужен только ART.UCODE, тогда используйте коррелированный подзапрос с not exists
мне кажется, это «лучший» Это гарантирует, что ART.CODE не существует ни в одной из полей U_CODE вторичных таблиц. В корреляции нам все равно, какие данные возвращаются, только если найдено совпадение или нет. Все, что мы делаем здесь - это обеспечиваем для данного ART.CODE его нет ни в одной из вторичных таблиц. Двигатель может рано существовать, если найдено единственное совпадение; в отличие от левого соединения.
Я ожидаю, что этот подход будет более производительным и простым в поддержке, особенно если U_CODE является внешним ключом в каждой таблице, делающей его индексированным.
SELECT ART.CODE
FROM ART
WHERE not exists (SELECT 1 FROM CST WHERE ART.CODE = CST.U_CODE)
and not exists (SELECT 1 FROM CSTTD WHERE ART.CODE = CSTTD.U_CODE)
and not exists (SELECT 1 FROM ACQ WHERE ART.CODE = ACQ.U_CODE)
and not exists (SELECT 1 FROM SCON WHERE ART.CODE = SCON.U_CODE)
and not exists (SELECT 1 FROM PROMO WHERE ART.CODE = PROMO.U_CODE)
Вы можете просто оставить объединение объединиться и проверить NULL после объединения всех кодов. Если в какой-либо таблице не существует u_code, null будет возвращен из coalesce, и это те, которые вы ищете.
Однако, поскольку вы не определили, как эти таблицы взаимосвязаны, это может привести к гораздо большему количеству записей, чем необходимо, поскольку я не знаю, каковы фактические отношения и производительность пострадает.
SELECT ART.CODE
FROM ART
LEFT JOIN CST
on ART.CODE = CST.U_CODE
LEFT JOIN CSTTD
on ART.CODE = CSTTD.U_CODE
LEFT JOIN ACQ
on ART.CODE = ACQ.U_CODE
LEFT JOIN SCON
on ART.CODE = SCON.U_CODE
LEFT JOIN PROMO
on ART.CODE = PROMO.U_CODE
WHERE coalesce(CST.UCODE, CSTTD.UCODE, QCQ.U_CODE, SCON.U_CODE, SCON.U_CODE) is null
Третий способ, просто потому что мне весело, состоит в том, чтобы объединить результаты всех вложенных таблиц и затем проверить наличие любого u_Code. Но с точки зрения производительности неявное различение, выполненное для объединения, сводит на нет использование индекса, поэтому это будет медленно в зависимости от объема записей; но мне это нравится больше, чем всем оставшимся соединениям с точки зрения обслуживания, и это объединение кажется таким хакерским.
SELECT ART.CODE
FROM ART
LEFT JOIN (SELECT U_CODE FROM CST UNION
SELECT U_CODE FROM CSTTD UNION
SELECT U_CODE FROM ACQ UNION
SELECT U_CODE FROM SCON UNION
SELECT U_CODE FROM PROMO) Z
on ART.CODE = Z.U_CODE
WHERE Z.U_CODE Is null