Обработка всех возможных значений для пустого столбца в SQL Server 2008 - PullRequest
1 голос
/ 06 марта 2011

Я боролся с этой проблемой в течение нескольких недель. Я его прогуглил, и у меня ноль релевантных результатов (что, вероятно, означает, что я не могу понять, как Google это - не то, что ответа нет!)

Предположим, четыре таблицы

Таблица 1 - шаблоны

Template 1...  
Template 2...  
Template 3...  
Template 4...  

Таблица 2 - Периоды

Period 1...  
Period 2...  
Period 3...  
Period 4...  

Таблица 3 - Тип

Type 1...  
Type 2...

Таблица 4 - TemplateMatrix

Содержит матрицу, для которой применяются шаблоны, к какому периоду и типу. Большинство шаблонов применимо ко всем периодам, кроме 1, и для этого периода существуют специальные шаблоны. Вместо того, чтобы создавать запись templateMatrix для каждого шаблона для каждого периода, я создаю одну запись для каждого конкретного шаблона периода с этим periodID

EX:

PeriodID,   TypeID,  TemplateID  
1       ,   1     ,  1
2       ,   1     ,  2

и запись со значением NULL для PeriodID для всех других периодов для их шаблонов.

EX:

PeriodID,   TypeId, TemplateID  
NULL    ,   1,      3  
NULL    ,   2,      4

На самом деле существует около 40 периодов, около 8 шаблонов и 2 типа.

Мне нужен вид, который предоставит мне все возможные комбинации шаблонов и периодов - те, которые определены явно, и все остальные.

Другими словами,

Period 1, Type 1, Template 1  
Period 2, Type 1, Template 2  
Period 3, Type 1, Template 3  
Period 3, Type 2, Template 4  
Period 4, Type 1, Template 3  
Period 4, Type 2, Template 4  
Period 5, Type 1, Template 3  
Period 5, Type 2, Template 4  
Period 6, Type 1, Template 3  
Period 6, Type 2, Template 4 

В худшем случае я мог бы добавить все возможные записи в матрицу; тем не менее, это не очень нормализуется для меня, поскольку единственное различие между основной массой записей - это идентификатор периода.

Есть идеи? Я действительно в своем уме.

Спасибо, John

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

В течение нескольких недель вы боролись с проблемой, которую можно решить, просто храня важные бизнес-данные непосредственно в таблице . Мы говорим примерно о 360 рядах, верно? Просто вставьте строки. Jeez.

Основная причина вашей проблемы в том, что а) вы пытаетесь вставить два предиката в одну таблицу, и б) вы надеетесь переопределить, что означает NULL.

PeriodID,   TypeID,  TemplateID  
1       ,   1     ,  1
NULL    ,   1     ,  3  

Вы хотите, чтобы первый ряд означал что-то вроде этого:

Шаблон [TemplateID] используется в period [PeriodID] для чего-то из введите [TypeID]

Но вы хотите, чтобы второй ряд означал что-то вроде

Шаблон [TemplateID] используется в каждом период, который не был идентифицирован [PeriodID] в какой-то другой строке для чего-то типа [TypeID]

Подобные попытки почти всегда приводят к печали.

0 голосов
/ 06 марта 2011

Следующий выбор должен работать для вас:

SELECT DISTINCT p.PeriodID, ty.TypeID, tmpl.TemplateID 
FROM TemplateMatrix AS matrix 
JOIN Periods AS p ON 
   (
       -- Defined Periods
       (matrix.PeriodID = p.PeriodID) OR 
       -- Undefined Periods, excluding defined cases
       (
           IsNull(matrix.PeriodID, p.PeriodID) = p.PeriodID 
           AND p.PeriodID NOT IN (SELECT DISTINCT defMtrx.PeriodID FROM TemplateMatrix AS defMtrx)
       )
   )
JOIN Type AS ty ON (matrix.TypeID = ty.TypeID) 
JOIN Templates AS tmpl ON (matrix.TemplateID = tmpl.TemplateID) 

Это должно только сопоставить NULL для PeriodID со значениями для Period, которые явно не определены в вашей таблице TemplateMatrix, и использовать определенные комбинациидля периода / типа / шаблона, если доступно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...