2013-05-23 3 views
1

надеюсь, эта схема имеет смысл ...присоединяющегося SQL представления с альтернативными значениями вместо нулями

проблемы, что у меня много столбцов в много-много таблице, как я могу получить все значения столбцов в представлении , не делая ISNULL для каждой строки? (SQL Server 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, группирование, СТАНДОТКЛОН, СТАНДОТКЛОНП, ВАР, и ДИСПР.
  • Расчет. Столбец не может быть вычислен из выражения, которое использует другие столбцы. Столбцы, которые формируются с помощью заданных операторов 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 - все комбинации

enter image description here

view2 - все комбинации с языками enter image description here

соответствующий 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 enter image description here

здесь есть тестовая база данных с представлениями и таблицами: http://pastebin.com/4BpBSmHY

+0

Просто пытаюсь понять вопрос ... Так что, поскольку у FruitId 1 есть FruitName для обоих языков, нет новых строк. А поскольку FruitId 2 и 3 имеют значение только для английского языка, строка автоматически генерируется для всех других языков? – Tom

+0

да, это правильно. – Daniel

+0

Что делать, если есть другой язык «немецкий». Итак, у фрукта ID = 1 должна быть еще одна строка для третьего языка. Тогда какие плоды следует дублировать «немецким»? Apple или Pomme –

ответ

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
и затем вызвать выбор раз и заполнить все столбцы

.. в представлении

Смежные вопросы