2014-11-14 54 views
0

我有一个时间表表,每个时间表必须有一个或多个关联的标准。家长和孩子是这样的:返回满足条件的多行之间通用的列值

SchedId ScheduleName 
1  ScheduleA 
2  ScheduleB 
3  ScheduleC 

标准表:

CriteriaName CriteriaValue SchedId 
color   red    1 
width   wide    1 
depth   verydeep   1 
color   blue    2 
density   dense   3 
height   short   3 
porosity  spongy   3 

现在,我有数据记录,我需要确定正确的时间表。因为我的查询被限制在一个特定的域名中,所以我碰巧知道要测试哪个标准 - 换句话说,我知道我只对结果中有3个标准有兴趣,并且我知道它们是颜色,宽度和深度。

一个典型的数据记录集合可能看起来像:

Color  Width  Depth 
-------------------------------------- 
red   narrow  shallow 
red   medium  deep 
blue   wide  verydeep 
red   wide  verydeep 

我也碰巧知道有1,并具有一组给定的已知条件值只有1时间表。那么有什么更容易?

概念我所需的查询是这样的:

SELECT color, width, depth, SchedId 
    FROM [...] 

和正确的返回一行是:

red  wide  verydeep 1 

我使用的答案,类似的问题在这里得到所需SchedId在至少有两种不同的方法 - JOINing在条件表上为每个条件集(criterianame = color,criteriavalue = red)选择,加入SchedId,要求所有返回行的SchedId相同。这是有效的,因为我在查询中使用了文字值。

我无法找到任何方法,在一个普通的查询(无sproc)中获取我的数据行的值到JOIN子查询中用于比较。

我过去为这个确切问题使用的另一种技术是我试图避免的 - 我基于每个SchedId的标准计算匹配次数。如果给定SchedId的匹配数等于该Id的标准数,那么它是正确的Sched。我并不十分在意这种方法,尽管它的工作还行。这种技术与MySQL一起使用,但我现在正在使用T-SQL。

最后,我通过这种方式设计了标准表,允许无限数量的标准,以及无限数量的时间表的无限种标准。它已被证明是非常具有挑战性的。想法?

+0

我想你想执行动态交叉表查询。这在SQL Server中并不容易,但[可以](http://www.sommarskog.se/dynamic_sql.html#Crosstab)。 – Mike 2014-11-14 23:51:46

回答

3

为此,您可以使用条件汇总:

select pt.Schedid, pt.schedname, 
     max(case when ct.citerianame = 'color' then ct.criteriavalue end) as Color, 
     max(case when ct.citerianame = 'width' then ct.criteriavalue end) as Width, 
     max(case when ct.citerianame = 'depth' then ct.criteriavalue end) as Depth 
from parenttbl pt inner join 
    criteriatbl ct 
    on pt.schedid = ct.schedid 
group by pt.schedid, pt.schedname; 
1
SELECT 
    case when ct.citerianame = 'color' then ct.criteriavalue end Color, 
    ,case when ct.citerianame = 'width' then ct.criteriavalue end Witdh, 
    ,case when ct.citerianame = 'depth' then ct.criteriavalue end Depth 
    ,pt.Schedid 


FROM 
    parenttbl pt 
    inner join criteriatbl ct on pt.schedid = ct.schedid 
where 
    pt.schedid = 1