8

ビューを作成するために結合しているテーブルが10個あります。各テーブルからIDを選択するだけですが、ビューでは、各IDを複数回表示できますが、すべてのIDの組み合わせは常に一意になります。このビューに一意のIDになる別の列を作成する方法はありますか?

一意のIDを保存し、それを使用してビューに対してクエリを実行し、他のすべてのIDを取得できるようにしたいと思います。

4

6 に答える 6

4

複数のテーブルにまたがる階層を確立する必要があるという同様の問題がありました。各テーブルの ID として整数を使用している場合は、各テーブルの ID を varchar に変換し、テーブルごとに異なる文字を接頭辞として付けることができます。例えば

CREATE VIEW LocationHierarchy as

SELECT 'C' + CONVERT(VARCHAR,[Id]) as Id
      ,[Name]
      ,'S' + CONVERT(VARCHAR,[State]) as parent
  FROM [City]
  UNION
  SELECT 'S' + CONVERT(VARCHAR,[Id]) as Id
      ,[Name]
      ,'C' + CONVERT(VARCHAR,[Suburb]) as parent
  FROM [Suburb]

このソリューションの有効性は、データセットの大きさによって異なります。

于 2011-07-12T04:12:56.453 に答える
3

少なくともビューの順序を保証できる場合は、ROW_NUMBER()を使用してこれを行うことができると思います。例えば:

 SELECT
     ROW_NUMBER() OVER (ORDER BY col1, col2, col3) as UniqueId
 FROM <lotsa joins>

順序が同じで、最後にフィールドのみが追加されている限り、IDは一意になります。

于 2009-12-03T20:19:30.680 に答える
2

はい、最近、同じ要件がありました。

ビューを作成するときは、select ステートメントを として保持し、この に対して関数をTEMP_TABLE使用します。Row_number()TEMP_TABLE

次に例を示します。

CREATE VIEW VIEW_NM
AS
SELECT Row_number() OVER(ORDER BY column_nm DESC) AS 'RowNumber'  FROM 
(SELECT COL1,COL2 FROM TABLE1
UNION 
SELECT COL1,COL2 FROM TABLE2
) AS TEMP_TABLE;
于 2011-07-22T14:03:59.877 に答える
1

いいえ、ビューでそれを行うことはできません。できることは、このすべての情報を保持する一時テーブルを作成し、そこに各行のキーまたは一意の ID を作成することです。

于 2009-12-03T20:15:37.287 に答える
0

これを行おうとしているという事実は、データベースの設計やアプリケーションのアーキテクチャに大きな問題があることを示しています。

10 個のテーブルがあり、DB 設計者がすべてのテーブルに ID INT IDENTITY を平手打ちしただけだと推測するので、テーブルには約 (2^31)^10 行の可能性があります。

その数をカバーする可能性があると私が考えることができる唯一のデータ型は、すべての整数を 0 で埋められた文字列に変換し、それらをすべて大きな CHAR としてまとめることです。

私の推測では、あなたの本当の問題はビューのこの ID を取得することではなく、あなたがやろうとしている他のことです。それはあなたが尋ねるべき質問です。ただの勘です。

于 2009-12-03T20:23:34.527 に答える