两张桌子:
//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需要读写。它就像第一级第二级等等。
答案 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级。即如果阅读有另一个必要条件。