Объединить SQL-запросы Toad с уменьшением результатов вывода в один список - PullRequest
0 голосов
/ 01 мая 2018

Я пытался получить результат, когда несколько запросов возвращают более строгие результаты. Как я могу увидеть полный список, а также те записи, которые соответствуют более строгим условиям? Запрос 1 возвращает 538 записей сайтов в указанных округах.

SELECT E_SITES.ID "SITE ID",
E_SITES.NAME "SITE NAME",
E_SITES.ADDR_1 "SITE ADDRESS"
E_SITES.CITY_NAME || ', ' || E_SITES.STATE_CODE || ' ' || E_SITES.POSTAL_CODE,
E_SITES.COUNTY_NAME
FROM E_SITES
WHERE E_SITES.COUNTY_NAME IN ('ALLAMAKEE', 'BENTON', 'BLACK HAWK', 'BREMER', 'BUCHANAN', 'CHICKASAW', 'CLAYTON', 'DELAWARE', 'DUBUQUE')
ORDER BY E_SITES.ID

Запрос 2 возвращает количество сайтов, на которых определено контактное лицо. Это 503 записи.

SELECT E_SITES.ID "SITE ID",
E_SITES.NAME "SITE NAME",
E_SITES.ADDR_1 "SITE ADDRESS"
E_SITES.CITY_NAME || ', ' || E_SITES.STATE_CODE || ' ' || E_SITES.POSTAL_CODE,
E_SITES.COUNTY_NAME,
E_INDIVIDUALS.FIRST_NAME || ' ' || E_INDIVIDUALS.LAST_NAME
FROM E_SITES, E_AFFILIATIONS, E_INDIVIDUALS
WHERE E_SITES.SITE_ID = E_AFFILIATIONS.SITE_ID
AND E_AFFILIATIONS.INDIVIDUAL_RID = E_INDIVIDUALS.RID
AND E_AFFILIATIONS.AFFILIATION_TYPE = ('SITE_CONTACT')
AND E_SITES.COUNTY_NAME IN ('ALLAMAKEE', 'BENTON', 'BLACK HAWK', 'BREMER', 'BUCHANAN', 'CHICKASAW', 'CLAYTON', 'DELAWARE', 'DUBUQUE')
ORDER BY E_SITES.ID

Дальнейший запрос вернул бы те сайты с почтовым адресом, что уменьшило бы результаты до 486 записей. Мне нужно получить все 538 записей, независимо от того, есть ли у них контактный или почтовый адрес, и для тех, у кого они есть, по одной строке для каждого сайта.

Дополнительная информация
Мои текущие результаты могут выглядеть следующим образом для запроса 1 (включая заголовки столбцов для ясности, кавычки для различения элементов данных):
"ИД САЙТА" "ИМЯ САЙТА" "АДРЕС САЙТА" "ГОРОД, ГОСУДАРСТВЕННЫЙ ZIP" "COUNTY_NAME"
"09698" "BODINE ELECTRIC" "18114 KAPP DR" "PEOSTA, IA 52067" "BREMER"
"16895" "BRUGGEMAN LUMBER" "3003 WILLOW RD" "ХОПКИНТОН, IA 52237" "DELAWARE"
"40047" "ЖЕНЕВЬЕВ, ООО" "707 LINCOLN ST" "GARNAVILLOR, IA 52052" "CLAYTON"

Запрос 2, для которого требуется, чтобы контактное лицо в настоящее время возвращало только записи, соответствующие требованиям, хотя я использую оператор (+). "ИД САЙТА" "ИМЯ САЙТА" "АДРЕС САЙТА" "ГОРОД, ГОСУДАРСТВЕННЫЙ ZIP" "ИМЯ СОЮЗА" "ИМЯ ИМЕНИ ПЕРВОГО ИМЕНИ"
"40047" "ЖЕНЕВЬЕВ, ООО" "707 LINCOLN ST" "GARNAVILLOR, IA 52052" "CLAYTON" "DALE KARTMAN"

Я получаю 1 запись, а не 3 записи, причем у 2 нет контактного лица и 1 - с контактным лицом. Это моя дилемма. Я должен выполнить каждый из этих запросов отдельно, получить результаты и скопировать их в электронную таблицу. Затем я должен сопоставить записи с именами контактов по 1-му запросу всех объектов. Очень трудоемкий. Надеюсь, это поможет уточнить мои потребности.

1 Ответ

0 голосов
/ 02 мая 2018

Если я правильно вас понял, это OUTER JOIN, который вы ищете.

Вот простой пример (на основе таблиц Скотта EMP и DEPT), который показывает, что это такое.

В таблице DEPT 4 отдела:

SQL> select deptno from dept order by deptno;

    DEPTNO
----------
        10
        20
        30
        40

Однако ни один сотрудник не работает в отделе 40:

SQL> select deptno, ename from emp order by deptno;

    DEPTNO ENAME
---------- ----------
        10 KING
        10 CLARK
        10 MILLER
        20 FORD
        20 SMITH
        20 JONES
        30 JAMES
        30 TURNER
        30 MARTIN
        30 WARD
        30 ALLEN
        30 BLAKE

12 rows selected.

SQL>

Если вы хотите отобразить информацию, собранную из обеих этих таблиц (название отдела из таблицы DEPT и имя сотрудника из таблицы EMP), вы бы присоединились к этим таблицам - как и вы (я буду использовать синтаксис ANSI, который на самом деле JOINS таблиц, вместо того, чтобы перечислять их и помещать условия соединения в предложение WHERE):

SQL> select d.deptno, d.dname, e.ename
  2  from dept d join emp e on e.deptno = d.deptno
  3  order by d.deptno;

    DEPTNO DNAME          ENAME
---------- -------------- ----------
        10 ACCOUNTING     KING
        10 ACCOUNTING     CLARK
        10 ACCOUNTING     MILLER
        20 RESEARCH       FORD
        20 RESEARCH       SMITH
        20 RESEARCH       JONES
        30 SALES          JAMES
        30 SALES          TURNER
        30 SALES          MARTIN
        30 SALES          WARD
        30 SALES          ALLEN
        30 SALES          BLAKE

12 rows selected.

SQL>

Выглядит хорошо, но - я хотел бы получить информацию о DEPTNO = 40, хотя никто не работает в нем. Итак, используйте внешнее соединение:

SQL> select d.deptno, d.dname, e.ename
  2  from dept d left join emp e on e.deptno = d.deptno
  3  order by d.deptno;

    DEPTNO DNAME          ENAME
---------- -------------- ----------
        10 ACCOUNTING     KING
        10 ACCOUNTING     CLARK
        10 ACCOUNTING     MILLER
        20 RESEARCH       FORD
        20 RESEARCH       SMITH
        20 RESEARCH       JONES
        30 SALES          JAMES
        30 SALES          TURNER
        30 SALES          MARTIN
        30 SALES          WARD
        30 SALES          ALLEN
        30 SALES          BLAKE
        40 OPERATIONS

13 rows selected.

SQL>

Правильно! Вот! (обратите внимание, что LEFT JOIN дает тот же результат, что и LEFT OUTER JOIN; нет необходимости указывать «external», хотя это делает мысли несколько более очевидными).

Также есть «старый» оператор внешнего соединения Oracle, (+) (буквально, знак +, заключенный в круглые скобки). Вышеприведенный запрос также будет работать, если поставить его так:

select d.deptno, d.dname, e.ename
from dept d, emp e
where d.deptno = e.deptno (+);

Я бы посоветовал вам сделать то же самое с (внешним соединением) вашего запроса. Еще раз:

  • объединить таблицы в предложении JOIN
  • вставьте фильтры в предложение WHERE

Запрос будет легче читать и поддерживать, вы будете знать, что к чему, и - если необходимо (и это может даже иметь место для вас), если вы используете «старый» (+) оператор, вы выиграли не сможет внешнее соединение одной таблицы с несколькими таблицами. По мере углубления и углубления вам может понадобиться внешнее соединение некоторых таблиц с несколькими другими, и именно здесь происходит соединение ANSI.

Удачи!

...