2016-04-11 7 views
0

が、私はこのクエリを持っているとき、これが許可されていません。SQLサブクエリが1より大きい値を返しました。サブクエリ

SELECT * 
FROM Schedule_OverdueTasks 
WHERE Job_No LIKE (
    SELECT DISTINCT AREA_ID 
    FROM V_CONSTAT_PROJ_DATES 
    WHERE AREA_DESC IN ('aaa', 'bbb') + '%' 

が、これは私にこのエラーを与える:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

私はそうのように私のクエリを実行すると、私はエラーを取得していません、唯一の1 AREA_I

SELECT * 
FROM Schedule_OverdueTasks 
WHERE Job_No LIKE (
    SELECT DISTINCT AREA_ID 
    FROM V_CONSTAT_PROJ_DATES 
    WHERE AREA_DESC = 'aaa') + '%' 

があるので、私はそうのように私のクエリを再実行しようとした:

SELECT * 
FROM Schedule_OverdueTasks 
INNER JOIN V_CONSTAT_PROJ_DATES 
    ON V_CONSTAT_PROJ_DATES.JOB_NUMBER = Schedule_OverdueTasks.Job_No 
WHERE V_CONSTAT_PROJ_DATES.AREA_DESC IN ('aaa', 'bbb') 

しかし、同じ数の結果は得られません。私は間違って何をしていますか?

答えて

2

私はあなたがexistsを使用することをお勧めします:

SELECT ot.* 
FROM Schedule_OverdueTasks ot 
WHERE EXISTS (SELECT 1 
       FROM V_CONSTAT_PROJ_DATES pd 
       WHERE ot.Job_No LIKE pd.area_id + '%' AND 
        AREA_DESC IN ('aaa', 'bbb') 
      ); 
0

クエリに基づいて、Job_Noの末尾に追加の文字があり、AREA_IDがJob_Noの最初の数文字になるようです。 AREA_IDが設定された長さ(例えば5文字)である場合、あなたはこの

SELECT * FROM Schedule_OverdueTasks 
INNER JOIN V_CONSTAT_PROJ_DATES ON LEFT(Schedule_OverdueTasks.Job_No, 5) = V_CONSTAT_PROJ_DATES.AREA_ID 
WHERE V_CONSTAT_PROJ_DATES.AREA_DESC IN ('aaa', 'bbb') 
2

を試みることができる私はそう、私は答えのセクションを使用する必要がありますが、scalardata typeない `テーブル値のデータタイプをlikeとるコメントすることはできません

私は、現時点ではお勧めすることができるだろう、あなたのデータ構造最善を知らなくても、あなたが唯一の1つの値

そうにそれを比較することが可能であることを意味

SELECT * 
FROM Schedule_OverdueTasks 
INNER JOIN (
    SELECT DISTINCT AREA_ID 
    FROM V_CONSTAT_PROJ_DATES 
    WHERE AREA_DESC = 'aaa' 
    ) vcpd ON Job_No LIKE Area_ID + '%' 

編集: Per Gordonsが答えたように、existは結果セットを変更せずにパフォーマンスには理想的ですが、オプティマイザはこれを存在として解釈するかもしれませんが、あなたが意味するものを書く方が良いでしょう。

0

LIKE演算子の結果セットは、LIKE演算子がtrueまたはfalseを返すように評価されるため、1つのレコードのみを返す必要があります。

TOP 1を使用してエラーを回避します。

このクエリは失敗しませんが、正しい結果を得るためには、別の問題です。データと条件を改訂する必要があります。

SELECT * 
FROM Schedule_OverdueTasks 
WHERE Job_No LIKE (SELECT TOP 1 AREA_ID 
        FROM V_CONSTAT_PROJ_DATES 
        WHERE AREA_DESC IN ('aaa', 'bbb') + '%' 

LIKEの動作をテストするには、次のクエリを実行し、同じエラーメッセージが生成されます。

SELECT foo 
FROM (SELECT 1 foo 
      UNION ALL 
      SELECT 1 foo 
     ) bar 
WHERE 1 LIKE (SELECT 1 foo 
       UNION ALL 
       SELECT 2 foo 
       ); 
+0

なぜダウン投票?これは、エラーメッセージとこの質問の件名を正確に解決します。なんでも... –

関連する問題