我在过滤后的值模式中有四个表,并且在弄清楚如何扩展现有视图查询以基于过滤器结果包括其他列时遇到麻烦。
一个表包含默认项记录,在下面的示例中,我将这些项称为。该表还包含每个项目的默认值和默认描述。在示例中,这是dbo.Defaults表。
下一张表是一个表格,用于将这些项目的集合分组以用于后续的过滤器表。在示例中称为dbo.FilterGroup。
最后两个表是指向FilterGroup和Defaults以及它们自己的值和描述的过滤器。这些表仅包含项目的记录,这些记录在使用FilterGroup时将按以下顺序加入到过滤器中:Filter2> Filter1> Default。正如您将在示例中看到的那样,这意味着如果Filter1有项目记录,它将覆盖默认值,而Filter2将覆盖Filter1(如果存在)。
当前视图仅试图带回Value
过滤器数据的一部分,我必须找出一种方法来带回Value
和Description
所得的已过滤项目。
让我向您展示我拥有的示例,该示例应该更清楚地显示这种情况:
表和数据设置:
--dbo.Defaults
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='Defaults') drop table dbo.Defaults;
CREATE TABLE dbo.Defaults (
ItemKey varchar(128),
DefaultValue varchar(128),
DefaultDesc varchar(512),
) ON [PRIMARY]
GO
insert into dbo.Defaults VALUES ('Fruit1','Apple','system default value')
insert into dbo.Defaults VALUES ('Fruit2','Orange','system default value')
insert into dbo.Defaults VALUES ('Fruit3','Pear',NULL)
insert into dbo.Defaults VALUES ('Fruit4','Tomato','system default value')
--dbo.Filter group
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='FilterGroup') drop table dbo.FilterGroup;
CREATE TABLE dbo.FilterGroup (
ID integer NOT NULL
IDENTITY (1,1) CONSTRAINT [PK_ParamFilterSet] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF),
GroupName varchar(128)
) ON [PRIMARY]
GO
insert into FilterGroup values ('Group1')
--dbo.Filter1
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='Filter1') drop table dbo.Filter1;
CREATE TABLE dbo.Filter1 (
ItemKey varchar(128), --Defaults.ItemKey
GroupID int, --FilterGroup.ID
FilterValue varchar(128),
FilterDesc varchar(512),
) ON [PRIMARY]
GO
insert into dbo.Filter1 VALUES ('Fruit2',1,'Seedless Orange',NULL)
--dbo.Filter2
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='Filter2') drop table dbo.Filter2;
CREATE TABLE dbo.Filter2 (
ItemKey varchar(128), --Defaults.ItemKey
GroupID int, --FilterGroup.ID
FilterValue varchar(128),
FilterDesc varchar(512),
) ON [PRIMARY]
GO
insert into dbo.Filter1 VALUES ('Fruit3',1,'Pyrus Pear','filter2 value')
我的查询:
SELECT fg.GroupName as [FilterGroup]
,d.ItemKey as [ItemKey]
,coalesce(f2.FilterValue, f1.FilterValue ,d.DefaultValue) as [Value]
FROM dbo.Defaults d cross join dbo.FilterGroup fg
left outer join dbo.Filter1 f1 on f1.ItemKey = d.ItemKey
and f1.GroupID = fg.ID
left outer join dbo.Filter2 f2 on f2.ItemKey = d.ItemKey
and f1.GroupID = fg.ID
如上所述,现有查询正确地过滤了,使Filter2的值超过Filter1的值,Filter1的值超过Default的值,如果给定项目中没有过滤器,则返回Default的值。
我要弄清楚的是如何根据选择的合并集中命中哪个过滤器来包含f1.FilterDesc,f2.FilterDesc或d.DefaultDesc。如何执行此联接,并从合并中出现的表中同时提取“值”和“ desc”列?
在此先感谢您提供的任何帮助!
一种简单的方法是:
SELECT fg.GroupName as [FilterGroup],
d.ItemKey as [ItemKey],
coalesce(f2.FilterValue, f1.FilterValue, d.DefaultValue) as [Value],
(case when f2.FilterValue is not null then 'f2'
when f1.FilterValue is not null then 'f1'
else 'default'
end) as which
FROM dbo.Defaults d cross join
dbo.FilterGroup fg left outer join
dbo.Filter1 f1
on f1.ItemKey = d.ItemKey and f1.GroupID = fg.ID left outer join
dbo.Filter2 f2
on f2.ItemKey = d.ItemKey and f1.GroupID = fg.ID;
一种更聪明的方法将逻辑放入from
:
SELECT fg.GroupName as [FilterGroup],
d.ItemKey as [ItemKey],
coalesce(f2.FilterValue, f1.FilterValue, d.DefaultValue) as [Value],
coalesce(f2.which, f1.which, 'default') as which
FROM dbo.Defaults d cross join
dbo.FilterGroup fg left outer join
(SELECT f1.*, 'f1' as which
FROM dbo.Filter1 f1
) f1
on f1.ItemKey = d.ItemKey and f1.GroupID = fg.ID left outer join
(SELECT f2.*, 'f2' as which
FROM dbo.Filter2 f2
) f2
on f2.ItemKey = d.ItemKey and f1.GroupID = fg.ID;
最后条件应该是f1.GroupId = fg.ID
还是f2.GroupID = fg.ID
?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句