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
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;
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
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
5条答案
按热度按时间92dk7w1h1#
希望您能收到逐行记录。在这种情况下使用union
如果需要基于列的记录,则需要使用联接或子查询。如果这是你的要求,请告诉我。或者你在期待下面?
clj7thdc2#
您可以重新编写任何使用内部联接的查询,方法是生成一个叉积,然后使用可能的结果进行过滤
on
连接的子句。所以,这两个是相同的:
以及:
我不知道你为什么这么做。这是个奇怪的问题。
wz3gfoph3#
下面是查询。
rkkpypqq4#
raogr8fs5#
内部连接可以用作过滤器,也可以复制行,具体取决于您的数据。
如果id存在1002条记录,则使用分析函数计算标志=1。然后使用此标志进行筛选:
实际上,这并不完全相同,因为如果可能存在多个代码为\u id=1002的记录,那么内部联接理论上可以复制行。使用analytic max()的此查询不会复制行。如果您的数据不包含重复项,那么内部联接将不会复制行,并且此解决方案将产生相同的结果。如果您需要可能的复制,那么内部连接是正确的解决方案。