Проверьте наличие записи в нескольких таблицах - PullRequest
0 голосов
/ 04 июня 2019

Моя колонка ART.CODE остальные таблицы: CST, CSTTD, ACQ, SCON, PROMO в этих таблицах «Код» называется «U_Code». Код может быть нулевым в этих вторичных таблицах. Я должен проверить существование «Code» хотя бы в одной из вторичных таблиц, я пытался использовать левое соединение, но оно всегда восстанавливает значение, потому что Code в таблице «ART» никогда не бывает нулевым ... Я понятия не имею, как сделать это, если не использовать столько запросов, сколько имеется таблиц, о которых идет речь, и при первом совпадении остановите меня.

1 Ответ

0 голосов
/ 04 июня 2019

Если вам нужен только 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...