多数の行と列を持つテーブル (エイリアス: bigtable) と、常に 1 行で複数の列を持つテーブル (エイリアス: 1rowtable) があるとします。1rowtable は bigtable とは何の関係もありません。動的に変更される私のスクリプトが使用するいくつかの設定のためだけです。そのため、静的な SQLCMD 変数を使用することはできません。また、スクリプトに GO ステートメントがあるため、通常の変数を使用することもできません。
ここで、両方のテーブルにアクセスする select ステートメントを書きたいと思います。
私が行った場合:
SELECT ... FROM bigtable, 1rowtable
それはCROSS JOINを行うので、それは悪いことです。そのルートに行くことはできません。
1rowtable に CTE を使用する場合、そのフィールドにアクセスする必要があります。
SELECT field FROM 1rowtable
だからそれも悪い。次のようなテーブル値関数と同じです。
CREATE FUNCTION getSetting(@name nvarchar(40))
RETURNS TABLE
AS
RETURN (SELECT name FROM 1rowtable WHERE name = @name)
明らかに、スカラー関数は特定のデータ型しか返さないため、まったく使用できませんが、設定には異なるデータ型があります。それでも、明らかに、「SELECT .. FROM dbo.getfieldfrom1rowtable(..)」を実行せずにスカラー関数のように使用したいと思います。これは、1rowtable をクエリで頻繁に使用しているためです。
私もやってみました:
SELECT
(SELECT
<expression involving bigtable and 1rowtable>,
<expression involving bigtable and 1rowtable>,
<expression involving bigtable and 1rowtable>,
...
FROM 1rowtable)
FROM bigtable
しかし、もちろん、副選択は存在しない場合、複数の項目を選択することはできません...
それで、私は何をすべきですか?毎回「SELECT .. FROM dbo.getfieldfrom1rowtable(..)」を使用し続ける必要があるようですか? ちょっと興味があるんだけど :)
PS。ms SQL サーバー 2008r2