sql—去掉内部连接,但不丢失结构

hujrc8aj  于 2021-05-27  发布在  Hadoop
关注(0)|答案(5)|浏览(282)

现在我有下一个问题:

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

如果没有内部连接,如何重写此查询并获得相同的结果?

92dk7w1h

92dk7w1h1#

希望您能收到逐行记录。在这种情况下使用union

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;
clj7thdc

clj7thdc2#

您可以重新编写任何使用内部联接的查询,方法是生成一个叉积,然后使用可能的结果进行过滤 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

我不知道你为什么这么做。这是个奇怪的问题。

wz3gfoph

wz3gfoph3#

下面是查询。

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
rkkpypqq

rkkpypqq4#

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
raogr8fs

raogr8fs5#

内部连接可以用作过滤器,也可以复制行,具体取决于您的数据。
如果id存在1002条记录,则使用分析函数计算标志=1。然后使用此标志进行筛选:

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

实际上,这并不完全相同,因为如果可能存在多个代码为\u id=1002的记录,那么内部联接理论上可以复制行。使用analytic max()的此查询不会复制行。如果您的数据不包含重复项,那么内部联接将不会复制行,并且此解决方案将产生相同的结果。如果您需要可能的复制,那么内部连接是正确的解决方案。

相关问题