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

我能够做到的一种方法是使用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 会大大减慢结果。

我虽然可以像使用一样检查该行是否存在 ,然后调用一次选择并填充所有列CASE
WHEN dbo.ItemLanguages.ItemID is NULL THEN 1 ELSE 0 END as valid

..在视图中

于 2013-05-24T20:12:05.340 回答