Избавьтесь от внутреннего соединения, но без потери структуры - PullRequest
0 голосов
/ 07 февраля 2019

Теперь у меня есть следующий запрос:

select a.*,b.* from
(select id,
sid,
start_date,
end_date from table_1 where code_id = 1001) a
inner join
(select id,
sid,
start_date,
end_date
from table_1 where code_id = 1002) b
on a.id=b.id

Как мне переписать этот запрос без внутреннего объединения и получить тот же результат?

Ответы [ 5 ]

0 голосов
/ 07 февраля 2019

INNER JOIN может работать как фильтр, а также может дублировать строки, в зависимости от ваших данных.
Используйте аналитическую функцию для вычисления flag = 1, если для id существует 1002 запись.Затем отфильтруйте, используя этот флаг:

    select s.* from
    (select id,
    sid,
    start_date,
    end_date, 
    max(case when code_id = 1002 then 1 end) over(partition by id) as has_1002 --1002 exists for this id flag,
     --if you need values for record with code_id = 1002 the use this
    max(case when code_id = 1002 then sid end)  over(partition by id) as sid_1002
    --and so on for all columns 
    from 
        table_1 
    ) s
    where code_id = 1001 
      and has_1002 = 1 --id partition contains code_id = 1002

На самом деле, это не совсем то же самое, потому что ваше INNER соединение теоретически может дублировать строки, если возможно существование более одной записи с code_id = 1002 для одного и того же идентификатора.,Этот запрос с аналитикой max () не будет дублировать строки.Если ваши данные не содержат дубликатов, INNER join не будет дублировать строки, и это решение даст тот же результат.Если вам нужно возможное дублирование, INNER JOIN - правильное решение.

0 голосов
/ 07 февраля 2019
with cte as 
(
select id,
sid,
start_date,
end_date from table_1 where code_id in (1001,1002)
)


select a.*, b.* 
from cte a join cte b on a.id = b.id where a.code_id = 1001 and b. code_id = 1002
0 голосов
/ 07 февраля 2019

Вы можете переписать любой запрос, который использует внутреннее объединение, создав перекрестный продукт, а затем отфильтровав его с помощью того, что было бы предложением on объединения.

Итак, эти два идентичны:

Select a.*, b.*
  from a
  inner join b on a.id = b.id

И:

Select a.*, b.*
  from a, b
  where a.id = b.id

Почему именно вы это сделаете, я не знаю.Странный вопрос.

0 голосов
/ 07 февраля 2019

Ниже приведен запрос.

select 
t1.id,
t1.sid,
t1.start_date,
end_date from table_1 t1, table1 t2
where t1.code_id = 1001 and t2.codeid=1002
and t1.id=t2.id
0 голосов
/ 07 февраля 2019

Надеюсь, вы ожидаете строки по записям.В этом случае используйте объединение

select id,
sid,
start_date,
end_date from table 1 where code_id = 1001
union all
select id,
sid,
start_date,
end_date
from table 1 where code_id = 1002

Если вам нужны записи на основе столбцов, вам нужно использовать объединение или подзапрос.Дайте мне знать, если это ваше требование.Или вы ожидаете ниже?

select 
t1.id,t1.sid,t1.start_date,t1.end_date,t2.id,t2.sid,t2.start_date,t2.end_date
from table1 t1, table1 t2
where t1.id = t2.id
and t1.code_id = 1001 and t2.code_id = 1002;

Спасибо

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