簡體   English   中英

具有自連接表的SELECT子句

[英]SELECT clause with self joining table

兩張桌子:

//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需要讀寫。 就像第一級,第二級等等。

不是最好的解決方案,但是您可以這樣嘗試:

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

使用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

希望能幫助到你。

加盟標准

ON sq.SNAME='C++'; 

不關聯兩個表(sq和sq1),並將結果集限制為sq.SNAME ='C ++',這就是為什么在輸出中只獲取SNAME ='C ++'的原因。

該聯接將需要如下。

ON sq.Requires = sq1.sName 

然后,在Where子句中,您需要指定:

WHERE sq.sNAME = 'C++'

然后,您將在兩行中得到帶有“ C ++”的sq.sName。 在所有列中均帶有“ c”的sq1.sName。 和sq1。要求帶有“閱讀”和“撰寫”

要在單個輸出中獲得結果集,您將必須使用UNION或CTE。 一個UNION將為您提供所需的2個級別。 CTE可以給您n級。 也就是說,如果閱讀還有另一個必要條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM