Как разделить одну таблицу на две одинаковые в запросе
Создал я запрос, который на удивление правильно работал несмотря на то, что у меня ошибочно вышло не правильное соединение, суть заключается в том что мне нужно ввести индекс отделения отправления и отделения получения и я должен получить в ответе эти индексы и описание, например адресс, тип, название отделения. Структура такая, есть таблица Postoffice с колонами ID, POSTINDEX, ADDRESS, NAME. я сделал что-то типа такого
SELECT sender.postindex AS senderPostindex,
sender.ADDRESS as senderAdress,
sender.NAME as senderName,
recipient.postindex AS recipientPostindex,
recipient.ADDRESS as recipientAdress,
recipient.NAME as recipient Name
from POSTOFFICE p
INNER JOIN POSTOFFICE sender on sender.id = p.id
INNER JOIN POSTOFFICE recipient on recipient.id = p.id
WHERE :s = sender.postindex
and :r = recipient.postindex
в :s и :r я вбиваю индексы, к примеру 01001 и 65004 и мне должно выдать:
01001, Пушкинская 50, Отделение Одесса 01, 65004, Ришельевская 1, Отделение Харьков 04
к сожалению такой запрос выдает мне пустое поле, на сколько я понимаю что-то подобное можно делать через UNION, но вот вопрос можно ли сделать так что бы такой ответ у меня выдавался в одной строке вот таким вот обычным sql запросом?подскажите пожалуйста!
Ответы (3 шт):
По-моему, просто
SELECT sender.postindex AS senderPostindex,
sender.ADDRESS as senderAdress,
sender.NAME as senderName,
recipient.postindex AS recipientPostindex,
recipient.ADDRESS as recipientAdress,
recipient.NAME as recipient Name
FROM POSTOFFICE sender
CROSS JOIN POSTOFFICE recipient
WHERE :s = sender.postindex
and :r = recipient.postindex
Это называется non-equi-self-join. Чтобы быстрее работало сделал с корреляционным подзапросом:
with t (id, pidx, addr, name) as (
select 1, '01001', 'Пушкинская 50', 'Отделение Одесса 01' from dual union all
select 2, '65004', 'Ришельевская 1', 'Отделение Харьков 04' from dual)
select *
from t s
cross apply (
select *
from t r where r.id != s.id) r
where s.pidx = '01001' and r.pidx='65004'
/
ID PIDX ADDR NAME ID PIDX ADDR NAME
--- ----- ---------------- -------------------- --- ----- ---------------- --------------------
1 01001 Пушкинская 50 Отделение Одесса 01 2 65004 Ришельевская 1 Отделение Харьков 04
На старых версиях:
select *
from t s join t r on s.id != r.id
where s.pidx = '01001' and r.pidx='65004'
Таблицы sender и recipient никак не связаны меж собой просто с каждой нужно взять по одной строке
SELECT
s.postindex AS senderPostindex,
s.ADDRESS as senderAdress,
s.NAME as senderName,
r.postindex AS recipientPostindex,
r.ADDRESS as recipientAdress,
r.NAME as recipient Name
from
POSTOFFICE s
cross join POSTOFFICE r
WHERE
:s = s.postindex
and :r = r.postindex