我是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 ”表示版本是否在子版本表中包含SubVersion记录。
希望这能很好地解释问题情景。
提前致谢。
答案 0 :(得分: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;
答案 1 :(得分: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。
答案 2 :(得分: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
答案 3 :(得分:1)
嘿我还找到了一个问题的解决方案CASE
和IS NOT NULL
以及DISTICT
左外连接
解决方案:
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