0

我是 SQL 连接的新手。我有两张桌子

版本

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 ”表示版本在Sub-Version表中是否有 SubVersion 记录。

希望这能很好地解释问题场景。

提前致谢。

4

4 回答 4

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;
于 2012-06-27T06:01:00.667 回答
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,否则为零。

于 2012-06-27T05:58:30.107 回答
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
于 2012-06-27T06:03:29.830 回答
1

嘿,我还找到了一个解决这个问题的CASE方法IS 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
于 2012-10-14T06:50:33.467 回答