EXISTSでサブクエリが導入されていない場合、選択リストで指定できる式は1つだけです


176

私のクエリは次のとおりで、その中にサブクエリが含まれています。

 select count(distinct dNum)
 from myDB.dbo.AQ
 where A_ID in 
  (SELECT DISTINCT TOP (0.1) PERCENT A_ID, 
            COUNT(DISTINCT dNum) AS ud 
 FROM         myDB.dbo.AQ
 WHERE     M > 1 and B = 0 
 GROUP BY A_ID ORDER BY ud DESC)

私が受け取っているエラーは...

Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`

サブクエリを単独で実行すると正常に返されるので、メインクエリに問題があると思いますか?

回答:


230

サブクエリで2つ(または複数)の列を返して、WHERE A_ID IN (subquery)句の比較を実行することはできません。どの列と比較A_IDするのでしょうか。サブクエリは、の反対側の列との比較に必要な1つの列のみを返す必要がありINます。したがって、クエリは次の形式である必要があります。

SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)

また、一番上の行からのみ選択できるように並べ替えを追加する必要がありますが、並べ替えを行うためにCOUNTを列として返す必要はありません。ORDER句の並べ替えは、クエリによって返される列とは無関係です。

次のようなものを試してください:

select count(distinct dNum) 
from myDB.dbo.AQ 
where A_ID in
    (SELECT DISTINCT TOP (0.1) PERCENT A_ID
    FROM myDB.dbo.AQ 
    WHERE M > 1 and B = 0
    GROUP BY A_ID 
    ORDER BY COUNT(DISTINCT dNum) DESC)

83

戻り値を変数に割り当てるwhereクエリでは、1つの列と1つの行のみを返す必要があります。例:

select * from table1 where Date in (select * from Dates) -- Wrong
select * from table1 where Date in (select Column1,Column2 from Dates) -- Wrong
select * from table1 where Date in (select Column1 from Dates) -- OK

2
それは私を助けませんでした。同じエラーが表示されます。代わりに列を指定すると*役に立ちました。
Mohammedsalim Shivani

11

それは不平を言っています

COUNT(DISTINCT dNum) AS ud 

サブクエリ内。存在するクエリを実行している場合を除き、サブクエリから1つの列のみを返すことができます。なぜ同じ列を2回カウントしたいのかわかりません。表面的には、あなたがしていることに対して冗長に見えます。ここでのサブクエリはフィルターであり、結合とは異なります。つまり、データを制限するために使用します。取得する列を指定するためではありません。


時々、クエリ結果に対して結合することができ、それで問題が解決します!
JosephDoggie

5

ここでの非常に良い応答は別として、サブクエリをそのまま使用したい場合は、これも試すことができます。

アプローチ:

1)サブクエリから目的の列(1つのみ)を選択します

2)列名をマップする場所を使用する

コード:

 SELECT count(distinct dNum)
 FROM myDB.dbo.AQ
 WHERE A_ID in 
   (
    SELECT A_ID 
    FROM (SELECT DISTINCT TOP (0.1) PERCENT A_ID, COUNT(DISTINCT dNum) AS ud 
          FROM         myDB.dbo.AQ
          WHERE     M > 1 and B = 0 
          GROUP BY A_ID ORDER BY ud DESC
         ) a 
   )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.