【问题标题】:Oracle Cross joinOracle 交叉连接
【发布时间】:2013-05-01 01:41:28
【问题描述】:

我有这三张桌子。

表1:

Resource1
Resource2
Resource3

表2:

Period1
Period2
Period3

表3:

Resource1 Period1
Resource1 Period2
Resource1 Period2
Resource2 Period1
Resource2 Period1
Resource3 Period3

我需要得到这个结果:

Resource1 Period1
Resource1 Period2
Resource1 Period2
Resource1 Period3
Resource2 Period1
Resource2 Period1
Resource2 Period2
Resource2 Period3
Resource3 Period3
Resource3 Period1
Resource3 Period2

我尝试了外部连接,但没有效果。我发现交叉连接可能会有所帮助,但我没有成功实施它。能有这么好心的人帮我解决这些问题吗?

非常感谢, r.

【问题讨论】:

  • 您能解释一下如何创建结果集的规则吗? “不必要的行”是什么意思?
  • 很抱歉造成混乱。我将立即从描述中删除有关不必要行的注释。规则是: Table1 包含所有资源。表 2 包含系统中的所有开放期。表 3 包含在特定时期做出某事的资源。 (重复是可能的)每个资源都需要用他的名字提到所有的开放期,如果他已经在表 3 中提到了开放期,无论多少次,这些数据也必须在那里。所以结果:Table3 中的重复项应该在那里,并且当 Table2 中的一些开放时段丢失时,它们也应该在那里)。

标签: sql oracle cross-join


【解决方案1】:

使用公用表表达式生成所有组合,然后使用外连接来包含table3 中显示的重复项。

with cte as ( select resource, period
              from table1 cross join table2 )
select cte.resource
       , cte.period
from cte
     left outer join table3
          on (table3.resource = cte.resource
             and table3.period = cte.period ) 
;

这可能不会产生正确的答案,具体取决于您所说的“我不知道如何摆脱不必要的行”。您提供的输出似乎没有从表中丢弃 any 行,并且您没有提供任何规则。因此,如果这不能满足您的需求,您必须编辑您的问题以澄清问题。

【讨论】:

  • 您不一定需要 CTE,但我认为这个答案可以得到想要的结果。
  • @ypercube - 我同意 WITH 子句不是强制性的,但我喜欢它们,因为它们可以帮助澄清查询的结构。
  • 它完全符合我的需要!现在我可以明白为什么我的解决方案都不好了。我总是错过第二个条件:table3.period = cte.period 非常感谢。
【解决方案2】:

我得到了你的结果,但我不确定我的想法是否正确..

SELECT A.RESOURCEID,B.PERIOD 
FROM 
TABLE1 A CROSS JOIN TABLE2 B
UNION ALL
SELECT RESOURCEID,PERIOD
FROM TABLE3 C
GROUP BY RESOURCEID,PERIOD
HAVING COUNT(*)>1

http://www.sqlfiddle.com/#!4/36667/2

【讨论】:

  • sqlfiddle.com 很棒,谢谢分享
  • @roxor年,真的很方便,我也是从别人那里找到的:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2013-07-11
  • 2010-10-17
  • 2012-12-31
相关资源
最近更新 更多