2012-06-27 33 views
0

我是SQL聯接的新手。 我有兩個表在sql場景中的JOINS

版本

Vid, VName, IsActive 
1 V1  1 
2 V2  0 
3 V3  1 

分版

SVid,Vid, VName 
1  1  0.1 
2  1  0.2 
3  2  0.1 

在上面的表格每個版本有許多分版的

我需要從上面的表中獲取結果,其中輸出應該是這樣的。

Vid, VName, IsActive, SubVersionExists(Bit) 
1 V1  1  1 
2 V2  0  1 
3 V3  1  0 
在上述結果

設置列名「SubVersionExists」表示,如果版本顛覆表有顛覆的記錄。

希望這可以很好地解釋這個問題。

在此先感謝。

回答

3

這裏是一個版本沒有加入,但使用EXISTS (SELECT ...)它返回一個布爾值:

http://sqlfiddle.com/#!5/712bd/9

SELECT 
    Version.Vid, Version.VName, Version.IsActive, 
    EXISTS (
    SELECT NULL FROM SubVersion WHERE SubVersion.Vid = Version.Vid 
) AS SubVersionExists 
FROM Version; 

或者,如果你的SQL引擎不布爾值轉換爲0/1,就可以使用CASE

SELECT 
    Version.Vid, Version.VName, Version.IsActive, 
    CASE WHEN 
    EXISTS (SELECT NULL FROM SubVersion WHERE SubVersion.Vid = Version.Vid) 
    THEN 1 ELSE 0 END AS SubVersionExists 
FROM Version 

另一個版本LEFT JOIN + GROUP BY,如果你不要使用COUNT()

SELECT 
    Version.Vid, Version.VName, Version.IsActive, 
    CASE WHEN SubVersionVids.Vid IS NOT NULL 
     THEN 1 ELSE 0 END AS SubVersionExists 
FROM  Version 
LEFT JOIN (
    SELECT SubVersion.Vid 
    FROM  SubVersion 
    GROUP BY SubVersion.Vid 
) AS SubVersionVids 
    ON SubVersionVids.Vid = Version.Vid; 

或者你可以使用DISTINCT代替GROUP BY

SELECT 
    Version.Vid, Version.VName, Version.IsActive, 
    CASE WHEN SubVersionVids.Vid IS NOT NULL 
     THEN 1 ELSE 0 END AS SubVersionExists 
FROM  Version 
LEFT JOIN (
    SELECT DISTINCT SubVersion.Vid 
    FROM   SubVersion 
) AS SubVersionVids 
    ON SubVersionVids.Vid = Version.Vid; 
+0

哇感謝您的快速回復它爲我工作 – sandeep

+0

我希望你可以選擇一個:) – biziclop

2
select v.vid,v.vname,v.isactive,count(s.svid) as SubVersionExists from 
Version v left join Sub-Version s on v.vid=s.vid group by v.vid; 

這裏SubVersionExists's值將大於零,如果子版本存在相應的版本。


select v.vid,v.vname,v.isactive, case when count(s.svid) > 0 then 1 else 0 end 
as SubVersionExists from Version v left join Sub-Version s on v.vid=s.vid 
group by v.vid; 

這個查詢將得到所期望的結果即SubVersionExists's值將是1,如果子版本存在其他零各自的版本。

1
SELECT V.VID, V.NAME, V.ISACTIVE, 
CASE 
WHEN COUNT(SV.SVID)=0 then '0' 
WHEN COUNT(SV.SVID)>0 then '1' 
END 
VERSION V LEFT JOIN SUBVERSION SV ON V.VID=SV.VID 
GROUP BY V.VID, V.NAME, V.ISACTIVE 
1

嘿,我也發現了這個問題的解決方案與CASEIS NOT NULLDISTICT用左外連接

解決方案:

SELECT DISTINCT v.vid,v.vname,v.isactive, 
    'SubVersionExists' = CASE WHEN vs.vid IS NOT NULL THEN 1 ELSE 0 END 
FROM VERSION v 
    LEFT OUTER JOIN 
subversion vs 
ON v.vid = vs.vid