我一直在寻找解决我问题的方法,但无济于事。我有这个存储过程来选择某些数据。我被告知要修改它以添加一个列' Status'。现在,此存储过程一次选择一个组件的信息。所以说对于组件A:我有以下查询和结果:
Declare @comp varchar(175)
Select CT.ComponentPart
CL.ComponentSupplier,
CS.ComponentSource
From ComponentParts CT
inner join ComponentSource CS on CS.ComponentID=CT.ComponentID
inner join ComponentSupplier CL on CL.ComponentTypeID=CS.ComponentTypeID
Where CT.ComponentPart = @Comp
现在上述查询的结果是:
ComponentPart ComponentSupplier ComponentSource
CAF123 Supplier1 PLNT1
CAF123 Supplier2 PLNT2
CAF123 Supplier3 PLNT3
CAF123 Supplier4 PLNT1
我被要求在此查询中添加另一列名为"组件状态"如果其中一个PLNT不是来自某个列表,那么我将整个列值设置为"过时"如果该特定组件的所有工厂都在列表中,那么我将该列设置为" Active"。现在我创建了一个表,并在其中添加了植物列表以及ID字段(列名称:PlntID,PLNTSource)。
但我遇到的问题是我尝试在上面的查询中继续加入该表,并在select子句中有一个case语句,如果PLNTSource字段为null,则设置为Obsolete else Active但我无法设置整个& #34;状态"根据查询中的列表将列设置为一个值,无论如何要做到这一点?我得到的是
Declare @comp varchar(175)
Select CT.ComponentPart
CL.ComponentSupplier,
CS.ComponentSource,
CASE
WHEN CST.PLNtSource IS NULL
THEN 'obsolete'
else 'Active'
END as 'Status'
From ComponentParts CT
inner join ComponentSource CS on CS.ComponentID=CT.ComponentID
inner join ComponentSupplier CL on CL.ComponentTypeID=CS.ComponentTypeID
left join ComponentStat CST on CST.PlNtSource=CS.ComponentSource
Where CT.ComponentPart = @Comp
查询结果:
ComponentPart ComponentSupplier ComponentSource Status
CAF123 Supplier1 PLNT1 Active
CAF123 Supplier2 PLNT2 Obsolete
CAF123 Supplier3 PLNT3 Obsolete
CAF123 Supplier4 PLNT1 Active
我想要达到什么结果:
ComponentPart ComponentSupplier ComponentSource Status
CAF123 Supplier1 PLNT1 Obsolete
CAF123 Supplier2 PLNT2 Obsolete
CAF123 Supplier3 PLNT3 Obsolete
CAF123 Supplier4 PLNT1 Obsolete
任何想法?
答案 0 :(得分:0)
使用临时表,将结果存储在列状态的临时表中,并通过在if exists条件中将列状态设置为过时来更新表< / p>
您可以使用if exists条件并将值硬编码为&#39;过时&#39;或者声明一个变量并将其作为“过时的”#39;或者&#39; Active&#39;符合您的条件并在您的选择陈述中使用
答案 1 :(得分:0)
我可以建议以下方法,它使用CTE使事情更具可读性和可管理性。请注意,SQL Server中的CTE可以使用变量,只要它们在同一批次中定义即可。由于您确定整个查询的状态是相同的,我们可以使用子查询来计算此值,然后在原始查询中使用它。
WITH cte AS (
SELECT CT.ComponentPart,
CL.ComponentSupplier,
CS.ComponentSource,
CST.PLNtSource
FROM ComponentParts CT
INNER JOIN ComponentSource CS
ON CS.ComponentID = CT.ComponentID
INNER JOIN ComponentSupplier CL
ON CL.ComponentTypeID = CS.ComponentTypeID
LEFT JOIN ComponentStat CST
ON CST.PlNtSource = CS.ComponentSource
WHERE CT.ComponentPart = @Comp
)
SELECT t1.ComponentPart,
t1.ComponentSupplier,
t1.ComponentSource,
(SELECT CASE WHEN SUM(CASE WHEN t2.PLNtSource IS NULL THEN 1 ELSE 0 END) > 0
THEN 'Obsolete'
ELSE 'Active' END
FROM cte t2) AS Status
FROM cte t1