2014-11-14 95 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