1

多数の行と列を持つテーブル (エイリアス: 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

4

1 に答える 1

2

特に行が1つしかない場合は、クロス結合を使用してテーブルの行をまとめることに問題はありません。

構文を使用します。

select bt.*, ort.*
from bigtable bt cross join
     onerowtable ort

クロス結合が正しく使用されている場合、本質的に「間違った」ものはありません。問題は、それらが誤って使用された場合です。100万行の2つのテーブルを相互結合する場合。。。さて、あなたの一時スペースはいっぱいになり、あなたのプロセッサは非常に忙しくなり、そしてリソースの不足のためにクエリは最終的にクラッシュします。

ただし、ある行のテーブルを別のテーブルにクロス結合しても、まったく問題はありません。

于 2012-07-21T21:51:46.493 に答える