【发布时间】: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 或空白的额外列