需要DB Query的多个结果

时间:2011-04-17 15:38:43

标签: sql sql-server database

在我的场景中,我有以下两个表:

表1:tdc_doc_field_def

Column 1: field_id
Column 2: field_name

表2:tdc_doc_field_data

Column 1: info_card_id
Column 2: field_id
Column 3: field_data

Table 1内部我需要获得3个field_names,txtAppProposedChangeDesctxtAppProposedChangeTechBasistxtAppProposedChangeWorkConductedBy

Table 2内部是这些字段的field_data

我需要的是参数化查询,如果我指定info_card_id我能够获得3个数据字段。我有以下查询,它将从一个字段名称数据中获取数据,但不是全部三个:

SELECT
    tdc_doc_field_data.field_data AS txtProposedChange
FROM  tdc_doc_field_def 
INNER JOIN tdc_doc_field_data 
    ON tdc_doc_field_def.field_id = tdc_doc_field_data.field_id
WHERE
    (tdc_doc_field_data.info_card_id = '[txtInfoCardNumber]') 
    AND (tdc_doc_field_def.field_name = 'txtAppProposedChangeDesc')

需要帮助才能扩展这一点,以帮助我获得所有三个,txtAppProposedChangeDesctxtAppProposedChangeTechBasistxtAppProposedChangeWorkConductedBy?我真的很感激!

编辑:

我需要将结果集返回映射值到SELECT AS查询中。

2 个答案:

答案 0 :(得分:1)

您可能只需要使用IN语句中的WHERE子句

WHERE
(
tdc_doc_field_data.info_card_id = '[txtInfoCardNumber]') 
AND (tdc_doc_field_def.field_name in (
    'txtAppProposedChangeDesc',
    'txtAppProposedChangeTechBasis',
    'txtAppProposedChangeWorkConductedBy')
)

答案 1 :(得分:0)

假设密钥定义如下:

tdc_doc_field_def(field_id)
tdc_doc_field_def(field_name)
tdc_doc_field_data(info_card_id, field_id)

您应该能够通过以下查询找到所需内容:

select a.info_card_id
      ,max(case when b.field_name = 'txtAppProposedChangeDesc' 
                then a.field_data end) as txtAppProposedChangeDesc
      ,max(case when b.field_name = 'txtAppProposedChangeTechBasis' 
                then a.field_data end) as txtAppProposedChangeTechBasis
      ,max(case when b.field_name = 'txtAppProposedChangeWorkConductedBy' 
                then a.field_data end) as txtAppProposedChangeWorkConductedBy
  from tdc_doc_field_data a
  join tdc_doc_field_def  b using(field_id)
 where a.info_card_id = '[txtInfoCardNumber]'
   and b.field_name in(
           'txtAppProposedChangeDesc'
          ,'txtAppProposedChangeTechBasis'
          ,'txtAppProposedChangeWorkConductedBy'
       )
 group 
    by a.info_card_id;

或者,如果您有一个info_card表,那么这样的表也应该有效:

select a.info_card_id
      ,b1.field_data as txtAppProposedChangeDesc
      ,c1.field_data as txtAppProposedChangeTechBasis
      ,d1.field_data as txtAppProposedChangeWorkConductedBy
  from info_card a
  left join tdc_doc_field_data b1 on(a.info_card_id = b1.info_card_id)
  left join tdc_doc_field_def  b2 on(
       b2.field_id   = b1.field_id
   and b2.field_name = 'txtAppProposedChangeDesc'
  )    
  left join tdc_doc_field_data c1 on(a.info_card_id = c1.info_card_id)
  left join tdc_doc_field_def  c2 on(
       c2.field_id   = c1.field_id
   and c2.field_name = 'txtAppProposedChangeTechBasis'
  )
  left join tdc_doc_field_data d1 on(a.info_card_id = d1.info_card_id)
  left join tdc_doc_field_def  d2 on(
       d2.field_id   = d1.field_id
   and d2.field_name = 'txtAppProposedChangeWorkConductedBy'
  )
 where a.info_card_id = '[txtInfoCardNumber]';