0

私はSQL結合の初心者です。私は2つのテーブルを持っています

バージョン

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 」は、バージョンのサブバージョンテーブルにサブバージョンレコードがあるかどうかを表します。

これが問題のシナリオをうまく説明していることを願っています。

前もって感謝します。

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 BYCOUNT()

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

ねえ私はまた、この質問の解決策を見つけまし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
于 2012-10-14T06:50:33.467 に答える