Как проверить наличие в двух таблицах одновременно - PullRequest
0 голосов
/ 31 января 2019

У меня есть SQL-запрос (оракул), который проверяет как людей, так и фирмы, проблема в том, что вы не найдете компанию в пользовательской таблице и наоборот.

На данный момент я пишу это в двух запросах, но я хотел бы сделать это в одном запросе (например, если я могу получить некоторую помощь при создании временной таблицы)

У меня есть информациятаблица, которая говорит мне, если это пользователь, компания или оба

sql выглядит примерно так:

Table1: 
    fk_id, 
    info1, 
    info2, 
    info3

Info_table: 
    fk_id, 
    <info if user, company or both>

User_table: 
    firstname, 
    lastname, 
    adress, 
    fk_id

Company_table: 
    Companyname, 
    adress, 
    fk_id

Я бы хотел, чтобы 1:

Создайте временную таблицу, которая выглядит следующим образом:

Temptable: 
    fk_id, 
    firstname(if user or both, else empty), 
    lastname(if user, else companyname), 
    adress

или создайте запрос, подобный следующему:

select table1.info1, table1.info2, firstname, lastname, adress 
from table1,
     user_table,
     company_table,
     info_table
where table1.fk_id = user_table.fk_id (if user or both)
   or table1.fk_id = company_table.fk_id (if company)

Любые советы о том, как решить эту проблему, были бы полезны.Каково лучшее решение (создание временной таблицы или добавление ее в исходный запрос)?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Использовать левое внешнее объединение (в этом ответе я буду использовать оператор + для удобства)

select table1.info1, table1.info2, 
    firstname, 
    nvl(lastname,company_name) lastname, 
    nvl(user_table.adress,company_table.adress) adress 
from table1,
    user_table,
    company_table,
    info_table
where 
    table1.fk_id=info_table.fk_id(+) 
    and table1.fk_id = user_table.fk_id(+) --(if user or both)
    and table1.fk_id = company_table.fk_id(+) --(if company)
0 голосов
/ 31 января 2019

Правильный способ написания этого запроса:

select t1.info1, t1.info2, ut.firstname, 
       coalesce(ut.lastname, ct.company_name) as lastname, 
       coalesce(ut.adress, ct.adress) as address 
from table1 t1 left join
     info_table it
     on t1.fk_id = it.fk_id left join
     user_table ut
     on t1.fk_id = ut.fk_id and
        it.info in ('both', 'user') left join
     company_table ct
     on t1.fk_id = ct.fk_id and
        ct.info in ('both', 'company') ;

Примечания:

  • Используется правильный, явный синтаксис standard JOIN, так какРекомендовано самой Oracle.
  • Это позволяет выполнять объединения только тогда, когда тип указывает, что это соединение является подходящим.
  • При этом используется COALESCE(), стандартная функция, а не сделанный на заказ NVL().
  • Все имена столбцов уточнены.
  • Используются псевдонимы таблиц, поэтому запрос легче писать и читать.
0 голосов
/ 31 января 2019

Вы можете использовать объединение:

быстрый пример:

select firstname
      ,lastname as name
      ,'person_table' as source_table
  from person_table
union
select null
      ,company_name
      ,'company_table'
  from company_table;

Результатом будет список как физических лиц, так и компаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...