Как фильтровать строки в модели SQL EAV? - PullRequest
3 голосов
/ 12 января 2012

Я получил таблицу EAV SQL, которая содержит список предпочтений, используемых для отображения графического интерфейса.Каждое предпочтение представлено строкой в ​​таблице.

Мне нужно отфильтровать эти строки, чтобы иметь только одну строку на каждую комбинацию столбцов ColumnName/key.Если столбец ID_UserPersonal не равен NULL, это означает, что строка представляет пользовательские предпочтения, которые должны иметь приоритет над значениями по умолчанию (когда ID_UserPersonal равно NULL).В этом случае предпочтение по умолчанию должно быть отфильтровано, а пользовательское значение должно быть сохранено для этой комбинации столбцов ColumnName/key.

Data Rows

Ответы [ 2 ]

4 голосов
/ 13 января 2012

Вы можете ранжировать строки с помощью ID_Personal, поместив NULL после ненулевых значений, затем выберите строки, в которых значения ранжирования равны 1, что-то вроде этого:

;
WITH ranked AS (
  SELECT
    *,
    rnk = ROW_NUMBER() OVER (
      PARTITION BY ID_Role, Section, GridName, ColumnName, [key]
      ORDER BY CASE WHEN ID_Personal IS NULL THEN 1 ELSE 0 END, DateCreated
    )
  FROM AnEAVTable
)
SELECT *  /* or specify your columns explicitly, which is even better */
FROM ranked
WHERE rnk = 1

Обратите внимание на PARTITION BY предложение функции ROW_NUMBER() в моем примере, если я добавил туда слишком много (или, возможно, слишком мало) столбцов.

Ссылки:

2 голосов
/ 12 января 2012

Вот полный пример того, что вам нужно:

create table #t(
f1 int null,
f2 int null,
f3 int null)

insert into #t values (1,2,3), (1,2,null), (1,3,null)



--select the not null
select t.* from #t t
where t.f3 is NOT NULL
UNION ALL
--union with the NULL not present in the previously select
select t.* from #t t
inner join (select convert(varchar,f1) + convert(varchar,f2) r
            from #t where f3 is not null) a
            on a.r <> convert(varchar,t.f1) + convert(varchar,t.f2)


drop table #t

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

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