【问题标题】:SQL Query procedure: adding new column based on select querySQL 查询过程:基于选择查询添加新列
【发布时间】:2015-10-16 19:00:35
【问题描述】:

好吧,伙计们,昨天我问了如何根据某些条件在 sql 查询中创建一个额外的列,有人告诉我使用 CASE WHEN 语句(再次感谢您!)它确实有效,但它只导致了以下字段在 true 并排除其他所有内容的情况下,我需要显示所有字段,并且我必须在查询中添加更多连接,现在我什至无法判断它是否有效,因为它在 2 小时后仍在执行。当我删除 case 语句时,它会在 6 秒内执行,所以我假设问题出在 case 语句上。是否有任何其他方法可以将名为“资格”的新列添加到选择查询中,其值基于:

如果“最终用途”字段是民用字段并且它存在于 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 

【问题讨论】:

  • 'End Use' 永远不会是 LIKE 'Civil%'。您正在比较文字字符串“最终使用”,而不是您构建的字段。你需要做CASE WHEN ct.CWhereUsedName LIKE 'Civil%'
  • 这些是分开的问题。或许你可以问why is this query so slow? 这样我们会要求你检查索引并提供分析结果。另一个为什么我没有得到结果的问题,你应该提供一些样本数据和期望的结果。请阅读How to create a Minimal, Complete, and Verifiable example.
  • @Siyual 谢谢你的回复我做了改变,但它仍在执行
  • @JuanCarlosOropeza 抱歉,我不知道您所说的索引是什么意思?根据这两个条件,最终结果只需要最后带有值 C 或空白的额外列
  • 那么你应该阅读THIS Index help db 以使查询更快。你用CREATE INDEXcommand

标签: mysql sql tsql


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多