SQL-запрос оставил внешнее соединение с текущим запросом - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть запрос, и я хочу посмотреть значения из другой таблицы в качестве ссылки, но не испортить результаты моего текущего запроса. Я думаю, что должен использовать Outer Left Join, но не уверен, как включить это в мой текущий запрос.

Мой текущий запрос выглядит примерно так:

SELECT a.primary_key,
       a.phase,
       b.project_number,
       c.LENGTH,
       d.color
  FROM TableA a,
       TableB b,
       TableC c,
       TableD d
 WHERE     c.primary_key = a.PROJECT_ID
       AND b.primary_key = a.PROJECT_ID
       AND b.primary_key = d.project_ID
       AND (c.date IS NULL OR c.number IS NULL)
       AND d.color IN ('black','red','blue')
ORDER BY 1

Теперь это дает мне таблицу из 50 результатов. TableContacts имеет значение поиска для моего b.project_number. Так, скажем, в моей таблице из 50 результатов, только 10 из них имеют b.project_number, мне нужно, чтобы значения поиска из «TableContacts» также отображались в моих результатах, но я не хочу, чтобы это влияло на мои результаты и сократило его до 10 Мне все еще нужны мои первые 50 результатов, просто с этой дополнительной информацией. Помощь

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Просто добавьте таблицу CONTACTS в свои объединения:

SELECT a.primary_key,
       a.phase,
       b.project_number,
       c.LENGTH,
       d.color, 
       ct.lookup_value --<< this is from the CONTACTS table
FROM TableA a
  JOIN TableB b ON b.primary_key = a.PROJECT_ID
  JOIN TableC c ON c.primary_key = a.PROJECT_ID
  JOIN TableD d ON b.primary_key = d.project_ID
  LEFT JOIN contacts ct ON ct.some_column = b.project_Number --<< this is the outer join to the CONTACTS table
WHERE (c.date IS NULL OR c.number IS NULL)
  AND d.color IN ('black','red','blue')
ORDER BY 1

Поскольку вы запутываете имена таблиц и столбцов, трудно догадаться, как именно должно выглядеть условие соединения в таблице CONTACTS.

0 голосов
/ 27 апреля 2018

Вы можете использовать этот подход:

Создайте таблицу с результатами вашего текущего запроса:

create table t1 as 
SELECT a.primary_key,
       a.phase,
       b.project_number,
       c.LENGTH_col,
       d.color
FROM a,b,c,d
WHERE c.primary_key = a.PROJECT_ID
       AND b.primary_key = a.PROJECT_ID
       AND b.primary_key = d.project_ID
       AND (c.date_col IS NULL OR c.number_col IS NULL)
       AND d.color IN ('black','red','blue')
ORDER BY 1;

Используйте объединение для получения желаемых результатов:

select t1.primary_key, t1.phase, t1.project_number, t1.length_col, t1.color, TableContacts.lookup_column
from t1, TableContacts
where t1.project_number = TableContacts.project_number
UNION
select t1.primary_key, t1.phase, t1.project_number, t1.length_col, t1.color, null
from t1 where t1.project_number is null;

Иллюстрация при создании фиктивных данных:

select * from a;
PRIMARY_KEY | PROJECT_ID | PHASE
1   100 Phase-1
2   200 Phase-2
3   300 Phase-3
4   400 Phase-4
5   500 Phase-5

select * from b;
PRIMARY_KEY | PROJECT_NUMBER
100 null
200 2000
300 3000
400 null
500 5000

select * from c;
PRIMARY_KEY | NUMBER_COL | LENGTH_COL | DATE_COL
100 null    99  null
200 null    99  null
300 null    99  null
400 null    99  null
500 null    99  null

select * from d;
PROJECT_ID  | COLOR
100 black
200 red
300 blue
400 black
500 yellow

select * from TableContacts;
PROJECT_NUMBER  | LOOKUP_COLUMN
1000    l-1000
2000    l-2000
3000    l-3000
4000    l-4000
5000    l-5000

Существующий запрос возвращает это:

SELECT a.primary_key,
       a.phase,
       b.project_number,
       c.LENGTH_col,
       d.color
FROM a,b,c,d
WHERE c.primary_key = a.PROJECT_ID
       AND b.primary_key = a.PROJECT_ID
       AND b.primary_key = d.project_ID
       AND (c.date_col IS NULL OR c.number_col IS NULL)
       AND d.color IN ('black','red','blue')
ORDER BY 1;

PRIMARY_KEY | PHASE | PROJECT_NUMBER | LENGTH_COL | COLOR
1   Phase-1 null    99  black
2   Phase-2 2000    99  red
3   Phase-3 3000    99  blue
4   Phase-4 null    99  black

Цель состоит в том, чтобы заполнить lookup_column, где project_number не равно нулю. Выполнение запроса на объединение в начале ответа:

select t1.primary_key, t1.phase, t1.project_number, t1.length_col, t1.color, TableContacts.lookup_column
from t1, TableContacts
where t1.project_number = TableContacts.project_number
UNION
select t1.primary_key, t1.phase, t1.project_number, t1.length_col, t1.color, null
from t1 where t1.project_number is null;

PRIMARY_KEY | PHASE | PROJECT_NUMBER | LENGTH_COL | COLOR | LOOKUP_COLUMN
1   Phase-1 null    99  black   null
2   Phase-2 2000    99  red     l-2000
3   Phase-3 3000    99  blue    l-3000
4   Phase-4 null    99  black   null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...