带有自联接表的SELECT子句

时间:2014-05-08 05:29:52

标签: sql oracle

两张桌子:

//SKILL
SNAME
---------------------
C++
C#
C
JAVA

//REQUIRED
SNAME          REQUIRED
------------------------
C++               C
C#             reading
C              writing
C              reading
JAVA              C

我使用了这个查询

SELECT DISTINCT sq.SNAME,sq1.requires AS "requires" FROM SREQUIRED sq
INNER JOIN SREQUIRED sq1
ON sq.SNAME='C++';

但我的输出是

SNAME                REQUIRES
-------------------------------
 C++                     C
 C++                  reading
 C++                  writing

我的问题是,如果我想找到技能C ++直接需要的技能,我应该使用什么查询?输出应该是这样的:

SNAME                 REQUIRES
-------------------------------
 C++                     C
 C                    reading
 C                    writing

因为C ++需要C,而C需要读写。它就像第一级第二级等等。

3 个答案:

答案 0 :(得分:1)

不是最好的解决方案,但您可以尝试这样:

select * from srequired
where sname='C++'
UNION
select * from srequired
where sname in (select required from srequired where sname='C++')

答案 1 :(得分:1)

使用CTE使其成为通用的。级别可能比2更深。 使用以下查询来获取所需的结果。

with cte
As
(
Select SName, [Required] from courses where SName = 'C++'
Union All
Select courses.SName, courses.[Required] from courses 
   inner join cte on courses.SName = cte.[Required]
)
select * from cte

希望它有所帮助。

答案 2 :(得分:0)

加入条件

ON sq.SNAME='C++'; 

不将两个表(sq和sq1)相关联,并将结果集限制为sq.SNAME =' C ++',这就是为什么你只能使用SNAME =' C ++'在输出中。

联接需要如下。

ON sq.Requires = sq1.sName 

然后在你的Where子句中你需要指定:

WHERE sq.sNAME = 'C++'

然后,您将使用' C ++'在2行。 sq1.sName与' c'在所有列中。和sq1.Requires'阅读'和'写作'

要在单个输出中获取结果集,您必须使用UNION或CTE。 UNION将为您提供所需的2个级别。 CTE可以给你n级。即如果阅读有另一个必要条件。