TSQL多表联接筛选视图,尝试根据筛选结果返回多个列(而不是一个)

桑迪弗吉尼亚

我在过滤后的值模式中有四个表,并且在弄清楚如何扩展现有视图查询以基于过滤器结果包括其他列时遇到麻烦。

一个表包含默认项记录,在下面的示例中,我将这些项称为。该表还包含每个项目的默认值和默认描述。在示例中,这是dbo.Defaults表。

下一张表是一个表格,用于将这些项目的集合分组以用于后续的过滤器表。在示例中称为dbo.FilterGroup。

最后两个表是指向FilterGroup和Defaults以及它们自己的值和描述的过滤器。这些表仅包含项目的记录,这些记录在使用FilterGroup时将按以下顺序加入到过滤器中:Filter2> Filter1> Default。正如您将在示例中看到的那样,这意味着如果Filter1有项目记录,它将覆盖默认值,而Filter2将覆盖Filter1(如果存在)。

问题

当前视图仅试图带回Value过滤器数据一部分,我必须找出一种方法来带回ValueDescription所得的已过滤项目。

让我向您展示我拥有的示例,该示例应该更清楚地显示这种情况:

表和数据设置:

--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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MySQL查询,我要筛选一个特定的列

Gorm仅返回一个而不是多个结果

Pandas筛选器函数返回了一个Series,但预期为标量布尔

加速筛选并根据多个条件对结果求和?

筛选一个单元格中定义的多个条件

作为一个结果返回多个“ WITH CTE”查询的结果

使用内部联接从查询语句返回一个结果

根据与另一个数据帧中列的逐行比较来筛选熊猫行的最有效方法?

尝试根据另一个ComboBox值将绑定的ObservableCollection筛选到组合框,但无法正常工作

筛选并创建一个新数组

我想让这个角度代码返回多个结果而不是一个

MongoDB:筛选文档中的多个数组,然后将重复的数组返回到一个数据中

BASH:通过另一个命令的返回值筛选文件列表

Oracle筛选存在多个,但只有一个可以评估

筛选R中多个列的前50个值

按工作日筛选返回空JSON,而Django Rest Framework应返回星期日的一个对象

如何根据Logstash中的一个索引从一个参数中筛选出记录

筛选一个BehaviorSubject

根据另一个列表中的True / False筛选列表中的元素

筛选一个DataFrame中满足熊猫另一个DataFrame中条件的多个单独行?

MySQL:将联接后的多个值合并到一个结果列中

根据集合交集筛选结果?

左联接计数返回一个结果

SQL-根据另一个表中的信息在一个表中搜索并返回多个结果

Excel筛选并在多个表之间联接

在数据透视图筛选器中,如何在要显示的列中选择一个正义范围?

筛选视图

筛选数组中的一个或多个元素

Excel 筛选器,多个条件,一列,两个条件都为真