Tsql 如何在SQLEAV模型中筛选行?

Tsql 如何在SQLEAV模型中筛选行?,tsql,entity-attribute-value,Tsql,Entity Attribute Value,我得到了一个EAV SQL表,其中包含用于显示GUI的首选项列表。每个首选项由表中的一行表示 我需要过滤这些行,使每个不同的ColumnName/key列组合只有一行。如果ID_UserPersonal列不为NULL,则表示该行表示特定于用户的首选项,当ID_UserPersonal为NULL时,该首选项必须优先于默认首选项。在这种情况下,必须过滤掉默认首选项,并且必须为该ColumnName/key列组合保留用户定义的首选项 以下是您需要的完整示例: create table #t( f1 i

我得到了一个EAV SQL表,其中包含用于显示GUI的首选项列表。每个首选项由表中的一行表示

我需要过滤这些行,使每个不同的ColumnName/key列组合只有一行。如果ID_UserPersonal列不为NULL,则表示该行表示特定于用户的首选项,当ID_UserPersonal为NULL时,该首选项必须优先于默认首选项。在这种情况下,必须过滤掉默认首选项,并且必须为该ColumnName/key列组合保留用户定义的首选项


以下是您需要的完整示例:

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
您需要将唯一标识表中某一行的字段串联起来。

您可以通过ID对行进行排序,在非空值之后放置空值,然后选择排序值为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
请注意我的示例中ROW_NUMBER函数的PARTITION BY子句,以防我在其中添加了太多或太少的列

参考资料:


结果会怎样?您可以简单地陈述以1开头的行号。请务必查看我更新的问题。我澄清了一些要点。为什么要同时存储这两个?如果我添加了一个引用,是否应该删除任何现有首选项或默认首选项,或者至少将其标记为非活动?@asmo还有一个问题,每行的唯一标识是什么?@aF:有一个唯一的行主键,一个int,但它隐藏在我拍摄的屏幕截图中。