50

次の表を検討してください。c_const

 code  |  nvalue
 --------------
 1     |  10000
 2     |  20000  

そして別のテーブルt_anytable

 rec_id |  s_id  | n_code
 ---------------------
 2      |  x     | 1

目標は、s_id次の式に基づいて計算列になることです。

 rec_id*(select nvalue from c_const where code=ncode)

これによりエラーが発生します。

このコンテキストでは、サブクエリは許可されていません。スカラー式のみが許可されます。

別のテーブルの列を入力として使用して、この計算列の値を計算するにはどうすればよいですか?

4

2 に答える 2

77

このためのユーザー定義関数を作成できます。

CREATE FUNCTION dbo.GetValue(@ncode INT, @recid INT)
RETURNS INT
AS 
   SELECT @recid * nvalue 
   FROM c_const 
   WHERE code = @ncode

それを使用して、計算列を定義します。

ALTER TABLE dbo.YourTable
   ADD NewColumnName AS dbo.GetValue(ncodeValue, recIdValue)
于 2010-05-04T21:13:24.767 に答える
25

これは、ビューの仕事のようです (計算された列で高速な検索が必要な場合は、インデックス付きビュー):

CREATE VIEW AnyView
WITH SCHEMABINDING
AS

SELECT a.rec_id, a.s_id, a.n_code, a.rec_id * c.nvalue AS foo
FROM AnyTable a
INNER JOIN C_Const c
    ON c.code = a.n_code

これは、結合の結果が複数ある場合にエラーを生成するのではなく、複数のレコードを返すという点で、サブクエリ バージョンとの微妙な違いがあります。しかし、それは上のUNIQUE制約で簡単に解決できますc_const.code(すでに であると思われますPRIMARY KEY)。

また、サブクエリ バージョンよりも理解しやすいです。

marc_s が示したように、サブクエリと UDF を使用して実行できますが、スカラー UDF は行ごとに計算する必要があるため、単純な に比べて非常に非効率的である可能性があります。JOIN

于 2010-05-04T21:19:26.023 に答える