SQL查询过程:根据选择查询添加新列

时间:2015-10-16 19:00:36

标签: mysql sql tsql

好的家伙昨天我问过如何根据某些条件在sql查询中创建一个额外的列,有人告诉我使用CASE WHEN语句(再次谢谢你!)哪个确实有效,但它只产生了字段如果真实并排除其他所有内容,我需要显示所有字段,我必须在查询中添加更多连接,现在我甚至无法判断它是否有效,因为它仍然在2小时后执行。当我删除case语句时,它会在6秒内执行,因此我假设问题与case语句有关。还有其他方法可以将名为“Eligibilty”的新列添加到选择查询中,其值基于:

  

如果'结束使用'字段是民用的并且它存在于p_SpecialPrograms表中,则其在新列中的值将为'C'。

     

如果'END USE'字段不等于civil,那么新列中的值将只是空白

Select distinct 
pn.PNumber, 
rp.PDescriptionText, 
ht.HNumber AS 'HTS', 
chs.CHistoryState AS 'HTS State', 
ct.CWhereUsedName AS 'End Use',
--CASE WHEN 'End Use' LIKE 'Civil%' AND pts.PSpecialTradeProgramAdded IS NOT NULL THEN ' ' ELSE 'C' END as 'Eligibility'
from t_COMPClients cc 
  join t_part pt on pt.coclientid=cc.coclientid AND cc.coclientid = 279
  join t_PARTNumbers pn on pn.PID=pt.pid
  join t_PARTDescriptions rp on rp.PID=pt.PID
  join t_PARTDescriptionTypes sp on   sp.PDescriptionTypeID=rp.PDescriptionTypeID AND sp.PDescriptionTypeID=1
  JOIN t_CLASS cs ON pt.PID = cs.PID
  JOIN t_CLASSHistory ch on ch.CID = cs.CID AND (ch.CHistoryStateID = 1 OR ch.CHistoryStateID = 2 OR ch.CHistoryStateID = 3)
  JOIN t_HTS ht on ht.HID = ch.HID AND ht.SYSubprocessID=8
  JOIN t_SYSSubProcesses sb on ht.SYSubprocessID = sb.SYSubProcessID
  JOIN t_CLASSHistoryStates chs ON chs.CHistoryStateID=ch.CHistoryStateID
  JOIN t_CLASSBufferCommodity cb on cb.SYSubProcessID=ht.SYSubprocessID 
  JOIN t_COMPClientSubProcessLink cw ON cw.SYSubProcessID=sb.SYSubProcessID
  JOIN t_CLASSWhereUsedTypes ct ON ct.COClientSubProcessLinkID=cw.COClientSubProcessLinkID
  left join t_PARTSources ps on ps.PID=pt.PID
  left join P_PARTSpecialTradePrograms pts on pts.PSourceID=ps.PSourceID 

1 个答案:

答案 0 :(得分:1)

问题是您尝试在同一查询级别内使用别名。

例如,这是无效的,因为在第二个字段'three'上不存在此级别

 SELECT 1 + 2  as 'three', 'three' * 2 as 'six'

你需要做这样的事情

SELECT subQuery.'three' * 2 as 'six'
FROM 
    (SELECT 1 + 2  as 'three') as subQuery

您创建

ct.CWhereUsedName AS 'End Use',

尝试在同一级别的CASE中使用'End Use'

所以替换

  CASE WHEN 'End Use'
  --with
  CASE WHEN t.CWhereUsedName