0

SELECT 1005 + ID FROM Users場合によっては、 (ID 列のデータに 1005 を追加する場合) のように、特定の列のデータに文字列または int を追加したいことがあります。動的に作成された列に対してこれを行うにはどうすればよいですか?

以下の作品:

SELECT ID,
       Name,
       (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
       Address
FROM data d

ただし、次の新しい行を追加するとエラーが発生しますInvalid column name "Email"

SELECT ID,
       Name,
       (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
       Email + ' testing ' AS Test, /* New line that causes error */
       Address
FROM data d

このエラーを修正するにはどうすればよいですか?

4

3 に答える 3

3

エイリアスを参照することはできません。式を繰り返すか (通常は、パフォーマンスの点で賢明でないか、構文の点で望ましくない)、サブクエリ / CTE を使用できます。そして、なぜ結合の代わりに相関サブクエリを使用しているのですか?

SELECT ID, Name, Email, Email + ' testing' AS Test, Address
FROM
(
  SELECT d.ID, d.Name, e.Email, d.Address
  FROM dbo.data AS d
  INNER JOIN dbo.Emails AS e
  ON e.ID = d.ID
) AS x;

...またはCTE...

;WITH x AS
(
  SELECT d.ID, d.Name, e.Email, d.Address
  FROM dbo.data AS d
  INNER JOIN dbo.Emails AS e
  ON e.ID = d.ID
)
SELECT ID, Name, Email, Email + ' testing' AS Test, Address
  FROM x;
于 2013-08-28T18:04:39.980 に答える
1

これはサブクエリで行うべきではありません。代わりに結合を使用してください。一般的に、相関サブクエリは、パフォーマンスを低下させる可能性があり、必要になることはめったにないため、貧弱な手法です。それらは、最初の手段の手法ではなく、最後の手段の手法であるべきです。

SELECT ID,
       Name,
       Email,
       Email + ' testing ' AS Test, 
       Address
FROM data d 
JOIN Emails e ON e.ID = d.ID

全員が電子メールを持っていない場合は、左結合を使用します。複数の電子メール アドレスがある場合は、フィルタリングするための追加の基準が必要になるか、集計関数を使用する必要がある場合があります。

于 2013-08-28T18:12:17.127 に答える
0

「範囲外」のものを参照しようとしていることが問題のようです。select ステートメントでサブクエリを使用すると、サブクエリ テーブルはその項目に対してのみアクセスできます。そのアクセスは、select ステートメント内の他の項目には引き継がれません。したがって、これはうまくいくはずです(醜くてうまくいくなら、醜くはありません)。

SELECT ID,
   Name,
   (SELECT Email FROM Emails WHERE Emails.ID = d.ID) AS Email,
   (SELECT Email FROM Emails WHERE Emails.ID = d.ID) 
      + ' testing ' AS Test, 
   Address
FROM data d
于 2013-08-28T18:44:19.147 に答える