2017-11-30 19 views
0

クエリでレコードを1つだけ返すようにするにはどうすればよいですか?私は次のエラーを受信して​​い

'Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, ...

は、ここに私のクエリです:

let getLinkTopicsSql = "SELECT  Topic.Id, 
            Topic.Name, 
            isnull((select 1 from FeaturedTopic where TopicId = Topic.Id),0) as IsFeatured 

         FROM   Topic 
         INNER JOIN LinkTopic 
             ON LinkTopic.TopicId = Topic.Id 
         INNER JOIN Link 
             ON LinkTopic.LinkId = Link.Id 
         WHERE  Link.Id = @LinkId" 

私が試した:このように

SELECT TOP 1 

を:

let getLinkTopicsSql = "SELECT TOP 1 Topic.Id, 
            Topic.Name, 
            isnull((select 1 from FeaturedTopic where TopicId = Topic.Id),0) as IsFeatured 

         FROM   Topic 
         INNER JOIN LinkTopic 
             ON LinkTopic.TopicId = Topic.Id 
         INNER JOIN Link 
             ON LinkTopic.LinkId = Link.Id 
         WHERE  Link.Id = @LinkId" 

しかし、私まだまだ同じ例外が発生する。

私は私はあなたがexistsをしたいと思います...

+0

これは、メインクエリではなく、TOP 1を必要とするSELECT句のサブクエリです。 – JNevill

+0

このクエリは 'TopicId = Topic.Id'が1レコード以上を返すFeaturedTopicから1を選択します。その結果をどうするかはわかりません。 'TopicId = Topic.Id'でFeaturedTopicからTOP1を選択してみてください。またはTopicId = Topic.IdのFeaturedTopicからDISTINCT1を選択してください。 – JNevill

+0

ORDER BYがないので、そのクエリは**おそらく非決定論です**。また、それを「通常の」結合に変換すると、多重度を調整できる場所を示すことができます。 – user2864740

答えて

3

この問題を解決するかどうかはわかりません。

(case when exists (select 1 from FeaturedTopic where TopicId = Topic.Id) 
     then 1 else 0 
end) as IsFeatured 

あなたはのように、isnull()でこれを行うことができます:

isnull((select top (1) 1 from FeaturedTopic where TopicId = Topic.Id), 0) as IsFeatured 

またはなし:

select coalesce(max(1), 0) from FeaturedTopic where TopicId = Topic.Id) as IsFeatured 

しかし、私はexistsが最も明白な形だと思います。

関連する問題