2012-09-01 8 views
10

He escrito la siguiente declaración de actualización, pero muestra el error como "Sintaxis incorrecta cerca de la palabra clave 'GRUPO'".Actualizar instrucción usando Unir y agrupar Por

UPDATE 
     J 
SET 
     J.StatusID = CASE WHEN SUM(DUV.VendorDUQuantity) = SUM(RD.InvoiceQuantity) THEN 1 ELSE J.StatusID END 
FROM 
     PLN_DU_Vendor DUV 
    INNER JOIN ENG_Release R ON R.ReleaseID = DUV.ReleaseID 
    INNER JOIN ENG_DU_Header H ON H.ReleaseID = R.ReleaseID AND DUV.DUID = H.DUID 
    INNER JOIN MKT_JobOrder J ON J.JobOrderID = R.JobOrderID 
    INNER JOIN MKT_CustomerOrder CO ON CO.OrderID = J.OrderID 
    LEFT JOIN PMT_RFDHeader RH ON RH.JobOrderID = J.JobOrderID 
    LEFT JOIN PMT_RFDDetail RD ON RD.RFDID = RH.RFDID AND RD.DUID = DUV.DUID     
WHERE 
     CO.OrderID = 100 
GROUP BY 
     J.JobOrderID 

En lugar de actualizar, Select funciona a la perfección para la consulta anterior. Cuál sería el problema y Cómo escribir la consulta en función de las cláusulas Join y Group By.

Respuesta

18

Usted puede intentar poner el grupo en el interior de una subconsulta, y luego unirse a la "JobOrderID", así:

UPDATE J 
SET J.StatusID = A.statusId 
FROM MKT_JobOrder J 
INNER JOIN (
    SELECT J.JobOrderID 
     , CASE 
      WHEN SUM(DUV.VendorDUQuantity) = SUM(RD.InvoiceQuantity) 
       THEN 1 
      ELSE J.StatusID 
      END AS statusId 
    FROM PLN_DU_Vendor DUV 
    INNER JOIN ENG_Release R ON R.ReleaseID = DUV.ReleaseID 
    INNER JOIN ENG_DU_Header H ON H.ReleaseID = R.ReleaseID 
           AND DUV.DUID = H.DUID 
    INNER JOIN MKT_JobOrder J ON J.JobOrderID = R.JobOrderID 
    INNER JOIN MKT_CustomerOrder CO ON CO.OrderID = J.OrderID 
    LEFT JOIN PMT_RFDHeader RH ON RH.JobOrderID = J.JobOrderID 
    LEFT JOIN PMT_RFDDetail RD ON RD.RFDID = RH.RFDID 
           AND RD.DUID = DUV.DUID 
    WHERE CO.OrderID = 100 
    GROUP BY J.JobOrderID 
      , J.StatusID 
    ) A ON J.JobOrderID = A.JobOrderID 
+0

gracias. También necesito Agrupar según el ID de estado también ... – thevan

+0

He editado mi respuesta. Buena suerte :) – hgulyan

3

sub consulta del usuario en lugar de realizar esta operación

UPDATE 
    J 
SET StatusID = x.Status 
    FROM 
    (select CASE WHEN SUM(DUV.VendorDUQuantity) = SUM(RD.InvoiceQuantity) THEN 1 
    ELSE J.StatusID END as Status 
    JobOrderID 
    FROM 
    PLN_DU_Vendor DUV 
    INNER JOIN ENG_Release R ON R.ReleaseID = DUV.ReleaseID 
    INNER JOIN ENG_DU_Header H ON H.ReleaseID = R.ReleaseID AND DUV.DUID = H.DUID 
INNER JOIN MKT_JobOrder J ON J.JobOrderID = R.JobOrderID 
INNER JOIN MKT_CustomerOrder CO ON CO.OrderID = J.OrderID 
LEFT JOIN PMT_RFDHeader RH ON RH.JobOrderID = J.JobOrderID 
LEFT JOIN PMT_RFDDetail RD ON RD.RFDID = RH.RFDID AND RD.DUID = DUV.DUID     
WHERE 
    CO.OrderID = 100 
GROUP BY 
    J.JobOrderID) X 
INNER JOIN MKT_JobOrder J On x.JobOrderID = J.JobOrderID 
+0

Su consulta no funcionará Hay dos columnas JobOrderId, debe especificar cuál debe usar. – hgulyan