SQL-为select语句中的所有查询行设置第三列值

时间:2017-03-10 04:39:41

标签: sql-server stored-procedures

我一直在寻找解决我问题的方法,但无济于事。我有这个存储过程来选择某些数据。我被告知要修改它以添加一个列' 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

任何想法?

2 个答案:

答案 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