2016-11-16 12 views
0

以下のSQLは次のコンテキストで正常に動作します:SQL Server SELECTステートメントはSETステートメント内で動作しますが、それ自体では失敗します。

USE ThisDB 

UPDATE guest.TABLE2 
SET this_var = (SELECT count(T1.key_field) 
       FROM ThisDB..TABLE1 T1 
       WHERE T1.key_field = guest.TABLE2.keyfield 
        AND T1.date_field between (DATEADD(DAY, -7, guest.TABLE2.other_date)) and guest.TABLE2.other_date) 

をしかし、それだけで、SELECT文は(下)エラー

マルチパート識別子「guest.TABLE2で失敗します。キーフィールド 'を縛ることができませんでした。 (4104)

SELECT 
    count(T1.key_field) 
FROM 
    ThisDB..TABLE1 T1 
WHERE 
    T1.key_field = guest.TABLE2.keyfield 
    AND T1.date_field BETWEEN (DATEADD(DAY, -7, guest.TABLE2.other_date)) 
          AND guest.TABLE2.other_date 
+4

selectステートメントでguest.Table2に参加していないためです。 –

+2

これは* correlation *と呼ばれます。内部クエリは外部クエリに関連付けられます。 – shawnt00

+0

元の質問に答えられない回答を正しい回答として選択しました –

答えて

0
SELECT 
    (
    SELECT count(T1.key_field) 
    FROM ThisDB..TABLE1 T1 
    WHERE T1.key_field = guest.TABLE2.keyfield 
     AND T1.date_field between 
      DATEADD(DAY, -7, guest.TABLE2.other_date) and guest.TABLE2.other_date 
    ) as newValue 
FROM guest.TABLE2; 

一つの簡単な方法は、あなたのupdateselectに変換します。基本的にsetselectに変換し、テーブル名をfrom句に移動しました。

また、SQL Serverのそれ以降のバージョンを使用している場合は、rangecount() over()と見なすこともできます。 SQLの初心者であり、高度なコンセプトになると思われます。

サブクエリが単独で実行されない理由は、私が上記のコメントで述べたようにです。内側クエリは、外部クエリの列を指し、相関と呼ばれます。それを取り出して別々に実行しようとすると、その参照を解決する方法はなくなりました。

+0

ありがとう! @ shawnt00 – procpy

2

guest.TABLE2.keyfieldこれは、更新と同じロジックでクエリでこのクエリ


に存在しない更新されたテーブルに属しています。
T2の各レコードについて、T1に基づいて更新する値を取得します。

select  guest.TABLE2.* 
      ,(SELECT count(T1.key_field) 
       FROM ThisDB..TABLE1 T1 
       WHERE T1.key_field = guest.TABLE2.keyfield 
        AND T1.date_field between (DATEADD(DAY, -7, guest.TABLE2.other_date)) and guest.TABLE2.other_date) 

from  guest.TABLE2 
+0

ありがとう、ありがとうございます。これは、FROM文にguest.TABLE2を追加することで解決されるでしょうか、それともオリジナルとは異なる結果を生み出すでしょうか? (更新あり) – procpy

+0

@ProcComment、編集された回答を参照 –

関連する問題