0

SQL Server 2008 R2 でビューを作成しようとしています。このビューでは、二重の 1 対 1 の関係を持つ 2 つのテーブルからデータが抽出されます。ビューに 2 つの列を作成し、いずれかの 1 つの列から値に基づいて作成したいと考えています。テーブル。

現在、表は次の例のようになっています。

表 A:

PrimaryKey | Name   | Value_FK | Number_FK
-------------------------------------------
66         | NameA  | 1         | 2
77         | NameB  | 3         | 4

表 B:

PrimaryKey | Value   
-------------------
1          | 238
2          | 456
3          | 100
4          | 200

ビューは次のようになります。

 Name   | Value | Number
-------------------------
 NameA  | 238   | 456
 NameB  | 100   | 200

('Value' と 'Number' は本質的に同じ型で、どちらも TableB の 'Value' 列にあります。 'ValueB')。

列「値」または列「番号」に入る値を決定する要因は、TableB の PrimaryKey と、TableA のいずれかの外部キーでのその参照です (ただし、両方の FK が同じキーを参照することはありません)。

これは、テーブル間に二重の関係を持つ、最も優れたデータベース モデルではない可能性があります。ただし、これは ADO.NET Entity Framework を使用して一部の C#.NET クラスをデータベースにマッピングするためです。クラス A にはクラス B の 2 つのオブジェクト (この場合は「値」と「数値」という名前) があり、現在のデータベース モデルはこれにより、2 つの関係が構築されます。これを変更することはできません。

これをグーグルで検索してみましたが、必要な答えを見つけるのは難しいと思います。特に、ほとんどの結果が反対の場合: 複数の列を選択して 1 つの列にします。

では、Select ステートメントはどのように記述すればよいでしょうか。

CREATE VIEW ViewName
AS
SELECT DISTINCT a.Name as 'Name', ????? as 'Value', ????? as 'Number'
FROM TableA a, TableB b

私は高度なSQLコマンドにかなり慣れていません。最後に私がこれほど高度なものに夢中になってから1年半以上経ちました。最初にこれに似たものを試しました:

CREATE VIEW ViewName
AS
WITH Name AS
( SELECT DISTINCT a.Name FROM TableA a  )

Value AS
(
    SELECT DISTINCT b.Value as 'Value' FROM TableA a, TableB b
WHERE b.PrimaryKey = an.ValueA_FK
),
Number AS
(
    SELECT DISTINCT b.Value  as 'Number'
    FROM TableA a, TableB b
    WHERE a.PrimaryKey = an.ValueB_PrimaryKey
)
SELECT DISTINCT 
    * FROM Name, Value, Number

完全に失敗した試みの結果は次のようになります。

 Name   | Value | Number
-------------------------
 NameA  | 100   | 200
 NameB  | 100   | 200
 NameA  | 100   | 456
 NameB  | 100   | 456
 NameA  | 238   | 200
 NameB  | 238   | 200
 NameA  | 238   | 456
 NameB  | 238   | 456

さて、クエリに何を入力するかについて何か提案はありますか?

4

2 に答える 2

4

FROM句で同じテーブルを複数回参照できます。

SELECT a.Name as 'Name', b1.Value as 'Value', b2.Value as 'Number'
FROM TableA a
  inner join TableB b1
          on
                a.Value_FK = b1.PrimaryKey
  inner join TableB b2
          on
                a.Number_FK = b2.PrimaryKey

DISTINCTを追加するのはあなたの習慣ではないはずであり、質問にはそれが必要であることを示唆するものは何もないので、私も削除しました。ANSI スタイルの結合も使用しました。これらは、ほとんどの場合、古いスタイルよりも優先されます (FROM句内のテーブルはコンマで区切られているだけです) 。


の一部の行にまたはが含まれTableAている可能性があり、それらの行をビューに表示したい場合は、の一方または両方を に切り替えます。次に、出力列を次の値にするか(この場合は完了)、または他の値にするか (この場合は、たとえば) も決定します。NULL Value_FKNumber_FKinner joinleft joinNULLCOALESCE(b1.Value,<Value when null>) as 'Value'

于 2013-06-26T13:49:34.117 に答える
0

このクエリにより、必要な結果が得られます。

select t1.Name, value.Value, number.Value as Number
from TableA t1
inner join TableB value on value.PrimaryKey = t1.Value_FK
inner join TableB number on number.PrimaryKey = t1.Number_FK

クエリを非常に複雑にしました。

于 2013-06-26T13:50:36.063 に答える