うまくいけば、このチャートは理にかなっています...
問題は、多対多テーブルに多くの列があること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