如何在SQL中的列子选择中使用当前选择列值

时间:2017-12-21 18:44:48

标签: sql-server tsql stored-procedures

我有一个查询,对于每一行,使用子查询将逗号分隔的字符串添加到一列。因此,例如,工单可以附加到许多部件。我做我的常规选择,但使用SQL函数'STUFF'来构建'Parts列。在结果中,艺术专栏有多个条目。所以我在列中使用'STUFF'进行子查询以使用基本查询的主列id获取所有部分?这对我来说有点奇怪,但是这个片段会帮助你理解我是什么试图完成:

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET FMTONLY OFF;

IF OBJECT_ID('tempdb..#TEMP_KikusuiRpt') IS NOT NULL DROP TABLE #TEMP_KikusuiRpt

-- Get the current date to work on if they do not send in date params. Meaning it is automated run --
-- if hey do send in date ranges, then it is manual run 


IF NULLIF(@StartDate, '') IS NULL
    BEGIN
        -- Set start date param to the first day of the current month
        SET @StartDate = DATEADD(mm, DATEDIFF(mm,0,GETDATE()), 0)   
    END
IF NULLIF(@EndDate, '') IS NULL
    BEGIN
        -- Set end day to the last day what ever that may be of the current month.
        SET @EndDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
    END

SELECT  
    manufacturer.mfrname AS Manufacturer, 
    model.modelnumber AS BaseModelNumber,
    control.controlserialnumber AS Serial, 
    Customer.CustCompany,
    Control.ControlDateAdded as Received,
    Control.ControlCalDate as 'Completed (Cal Date)',
    WorkOrder.WorkOrderID as woid,
    Receiver.ReceiverID,
    WorkOrderComments.CommentRcvr as 'Receiver Comments',
    WorkOrderCOmments.CommentRpt as 'Report Comments',
    ISNULL(STUFF((SELECT ', ' + PartID
        FROM WorkOrderPart WOP
            INNER JOIN WorkORder WO ON WOP.WorkOrderID = WO.WorkOrderID                         
            INNER JOIN Model ON Model.ModelID = WO.ModelID
         WHERE WO.MfrCode IN (SELECT MfrCode FROM Manufacturer where MfrName LIKE '%Kikusui%')
            --
            -- Right here i need somehow to do this
            --  
            --   the workorder on the stuff query needs to be attached to the base select work order row instance, or else i get all parts in each row not just for the work order
           where wo.WorkOrderID = WOID

        FOR XML PATH('')
        ), 1, 1, ''), 'NA') AS Parts

INTO #TEMP_KikusuiRpt
FROM WorkOrder 
INNER JOIN Control ON WorkOrder.ControlNumber = Control.ControlNumber
INNER JOIN model ON control.modelid = model.modelid 
INNER JOIN manufacturer on model.mfrcode = manufacturer.mfrcode         
INNER JOIN WorkOrderComments ON WorkOrderComments.WorkOrderID = WorkOrder.WorkOrderID   
INNER JOIN Receiver ON Receiver.ReceiverID = WorkOrder.ReceiverID
INNER JOIN Customer ON Customer.CustID = WorkOrder.CustID

WHERE Manufacturer.MfrName LIKE '%Kikusui%' 

AND @StartDate > WorkOrder.DateReceived 
AND @EndDate < WorkOrder.DateCompleted

SELECT * FROM #TEMP_KikusuiRpt

DROP TABLE #TEMP_KikusuiRpt

所以希望我已经足够清楚地解释了这一点。有办法处理这个吗?原因是我的Parts列已填充,但未过滤到返回的模型。

1 个答案:

答案 0 :(得分:1)

您只需要对外部和内部model表引用进行别名。这是主要选择的样子:

SELECT  
    manufacturer.mfrname AS Manufacturer, 
    m1.modelnumber AS BaseModelNumber,
    control.controlserialnumber AS Serial, 
    Customer.CustCompany,
    Control.ControlDateAdded as Received,
    Control.ControlCalDate as 'Completed (Cal Date)',
    WorkOrder.WorkOrderID as woid,
    Receiver.ReceiverID,
    WorkOrderComments.CommentRcvr as 'Receiver Comments',
    WorkOrderCOmments.CommentRpt as 'Report Comments',
    ISNULL(STUFF((SELECT ', ' + PartID
        FROM WorkOrderPart WOP
            INNER JOIN WorkORder WO ON WOP.WorkOrderID = WO.WorkOrderID                         
            INNER JOIN Model m2 ON m2.ModelID = WO.ModelID
         WHERE WO.MfrCode IN (SELECT MfrCode FROM Manufacturer where MfrName LIKE '%Kikusui%')
            AND m1.modelnumber = m2.modelnumber
        FOR XML PATH('')
        ), 1, 1, ''), 'NA') AS Parts
INTO #TEMP_KikusuiRpt
FROM WorkOrder 
INNER JOIN Control ON WorkOrder.ControlNumber = Control.ControlNumber
INNER JOIN model  m1 ON control.modelid = m1.modelid 
INNER JOIN manufacturer on m1.mfrcode = manufacturer.mfrcode         
INNER JOIN WorkOrderComments ON WorkOrderComments.WorkOrderID = WorkOrder.WorkOrderID   
INNER JOIN Receiver ON Receiver.ReceiverID = WorkOrder.ReceiverID
INNER JOIN Customer ON Customer.CustID = WorkOrder.CustID
WHERE Manufacturer.MfrName LIKE '%Kikusui%' 
    AND @StartDate > WorkOrder.DateReceived 
    AND @EndDate < WorkOrder.DateCompleted