1

うまくいけば、このチャートは理にかなっています...

問題は、多対多テーブルに多くの列があることISNULLです。行ごとに実行せずに、ビュー内のすべての列の値を取得するにはどうすればよいですか? (SQL サーバー 10.5)

 ITEM
+------+
| ID   |
|------|
| 1    |
| 2    |
| 3    |
+------+

 LANGUAGE
+-------+---------+
| ID    |  Name   |
|-------+---------|
| 1     | English |
| 2     | French  |
+-------+---------+

 Item Names
+----------+---------+------------+------------+
| ItemID   | LangId  |   Name     |   Color    |
|----------+---------+------------+------------|
| 1        |   1     |  apple     |  red       |
| 1        |   2     |  pomme     |  rouge     |
| 2        |   1     |  orange    |  orange    |
| 3        |   1     |  bannana   |  yellow    |
+----------+---------+------------+------------+

希望のビュー

+----------+---------+------------+------------+
| ItemID   | LangId  |   Name     |   Color    |
|----------+---------+------------+------------|
| 1        |   1     |  apple     |  red       |
| 1        |   2     |  pomme     |  rouge     |
| 2        |   1     |  orange    |  orange    |
| 2        |   2     |  orange    |  orange    | <--- added automatically
| 3        |   1     |  bannana   |  yellow    |
| 3        |   2     |  bannana   |  yellow    | <--- added automatically
+----------+---------+------------+------------+

ビューを作成しようとしているため、特定の制限があります。

ビューで変更される列は、テーブル列の基になるデータを直接参照する必要があります。列は、次のような方法で導出することはできません。

  • 集計関数: AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR、および VARP。
  • 計算。他の列を使用する式から列を計算することはできません。集合演算子 UNION、UNION ALL、CROSSJOIN、EXCEPT、および INTERSECT を使用して形成された列は計算になり、更新することもできません。

ただし、私は複数のビューを作成しています。これは、以前にこれらの制限のいくつかを回避した方法です。私はすでにこのテーブルを持っていると仮定できます

中間ビュー:

+----------+---------+------------+------------+
| ItemID   | LangId  |   Name     |   Color    |
|----------+---------+------------+------------|
| 1        |   1     |  apple     |  red       |
| 1        |   2     |  pomme     |  rouge     |
| 2        |   1     |  orange    |  orange    |
| 3        |   1     |  bannana   |  yellow    |
+----------+---------+------------+------------+

としても:

+----------+---------+------------+------------+
| ItemID   | LangId  |   Name     |   Color    |
|----------+---------+------------+------------|
| 1        |   1     |  apple     |  red       |
| 1        |   2     |  pomme     |  rouge     |
| 2        |   1     |  orange    |  orange    |
| 2        |   2     |  -         |  -         |
| 3        |   1     |  bannana   |  yellow    |
| 3        |   2     |  -         |  -         |
+----------+---------+------------+------------+

これらはビューの一部です:

view1 - すべての組み合わせ

ここに画像の説明を入力

view2 - 言語とのすべての組み合わせ ここに画像の説明を入力

対応する SQL:

SELECT     dbo.view1.ItemID, dbo.view1.LanguageID, dbo.ItemLanguages.Name, dbo.ItemLanguages.Color
FROM         dbo.ItemLanguages RIGHT OUTER JOIN
                      dbo.view1 ON dbo.ItemLanguages.LanguageID = dbo.view1.LanguageID AND dbo.ItemLanguages.ItemID = dbo.view1.ItemID

ビュー 2 の結果 ここに画像の説明を入力

ビューとテーブルを含むテスト データベースは次のとおりです: http://pastebin.com/4BpBSmHY

4

1 に答える 1

0

私がそれを行うことができた1つの方法は、ISNULL

SELECT     dbo.view1.ItemID,
    dbo.view1.LanguageID,
    ISNULL(dbo.ItemLanguages.Name,
      (SELECT     TOP (1) Name
        FROM          dbo.ItemLanguages AS x
        WHERE      (ItemID = dbo.view1.ItemID))) AS Name,
    ISNULL(dbo.ItemLanguages.Color,
      (SELECT     TOP (1) Color
        FROM          dbo.ItemLanguages AS x
        WHERE      (ItemID = dbo.view1.ItemID))) AS Color,
    CASE  
        WHEN  dbo.ItemLanguages.ItemID is NULL THEN 1
        ELSE 0
    END as valid

FROM         dbo.ItemLanguages RIGHT OUTER JOIN
                 dbo.view1 ON dbo.ItemLanguages.ItemID = dbo.view1.ItemID
                          AND dbo.ItemLanguages.LanguageID = dbo.view1.LanguageID

このアプローチが気に入らない理由は、これをさらに多くの列で行っているからです。複数の SELECTS を実行すると、結果が大幅に遅くなるという考えがあります。

のように行が存在するかどうかを確認してから 、選択を1回呼び出してすべての列にデータを入力することはできますがCASE
WHEN dbo.ItemLanguages.ItemID is NULL THEN 1 ELSE 0 END as valid

.. ビューで

于 2013-05-24T20:12:05.340 に答える