2017-01-19 4 views
0

Der folgende Code löst die folgende Ausnahme aus. Wie kann ich das beheben?SQL Server 2008 Angegebene Spalte wurde mehrmals angegeben

Msg 8156, Ebene 16, Status 1, Zeile 17
Die Spalte 'id' wurde mehrfach für 'QISproduct' angegeben.

Abfrage:

SELECT 
    g.artcode 
    , sum(g.aantal) 
    , i.class_01 
    , i.Isstockitem 
FROM 
    gbkmut AS g 
INNER JOIN 
    items AS i ON i.itemcode = g.artcode 
INNER JOIN 
    (SELECT 
     QISP.id 
     , QISprocess.nml 
     , QISeventlog.id 
     , QISeventlog.dtsample 
     , QISproduct.nms 
     , QISbatchlog.nm 
     , QIStestlog.idvariable 
     , QIStestlog.no 
     , QISshortnote.ds 
     , gewicht = CASE QIStestlog.IDvariable 
         WHEN '139' 
          THEN QIStestlog.no 
        END 
     , aantal = CASE QIStestlog.IDvariable 
         WHEN '234' 
          THEN QIStestlog.no 
        END 
     , siloleeg = CASE QIStestlog.idvariable 
         WHEN '23' 
          THEN CASE QIStestlog.no 
            WHEN '10' 
             THEN 'Ja' 
             ELSE 'Nee' 
           END 
         END 
     , QISvariable.nml 
     , gl.nm 
     , QISprocess.id 
    FROM 
     QIC.Vobra_new2.dbo.production AS QISP 
    INNER JOIN 
     QIC.Vobra_new2.dbo.process AS QISprocess ON QISP.idprocess = QISProcess.id 
    INNER JOIN 
     QIC.Vobra_new2.dbo.product AS QISproduct ON QISP.idproduct = QISproduct.id 
    INNER JOIN 
     QIC.Vobra_new2.dbo.batchlog AS QISbatchlog ON QISP.idbatch = QISbatchlog.id 
    INNER JOIN 
     QIC.Vobra_new2.dbo.eventlog AS QISeventlog ON QISeventlog.idproduction = QISP.id 
                AND QISeventlog.idbatch = QISbatchlog.id 
    INNER JOIN 
     QIC.Vobra_new2.dbo.testlog AS QIStestlog ON QIStestlog.idevent = QISeventlog.id 
    LEFT OUTER JOIN 
     QIC.Vobra_new2.dbo.shortnote AS QISshortnote ON QISshortnote.id = QIStestlog.no 
                 AND QIStestlog.idvariable = '144' 
    INNER JOIN 
     QIC.Vobra_new2.dbo.variable AS QISvariable ON QISvariable.id = QIStestlog.idvariable 
    LEFT OUTER JOIN 
     QIC.Vobra_new2.dbo.vvarxproc AS vvp ON vvp.idvariable = QISvariable.id 
              AND vvp.idprocess = QISP.idprocess 
    LEFT OUTER JOIN 
     QIC.Vobra_new2.dbo.attribute AS QISattribute ON QISattribute.id = vvp.idattribute 
    LEFT OUTER JOIN 
     QIC.Vobra_new2.dbo.grade AS QISgrade ON QISgrade.id = QISattribute.idgrade 
    LEFT OUTER JOIN 
     QIC.Vobra_new2.dbo.gradelevel AS gl ON gl.idgrade = QISattribute.idgrade 
              AND gl.nlevel = QIStestlog.no 
    WHERE 
     QISbatchlog.nm NOT LIKE 'V%' 
     AND QISP.dtstart > '2017-01-01' 
     AND QISP.dtstart < '2017-01-19' 
     AND QISP.idprocess IN ('12', '13', '14', '15', '16', '17', '18', '41') 
     AND QIStestlog.idvariable IN ('234', '139', '128') 
    ) QISproduct ON g.artcode = QISproduct.nms 
WHERE 
    g.bkjrcode > '2015' 
    AND g.reknr IN (3000, 3010, 3020) 
    AND g.aantal > 0 
    AND g.warehouse IN ('1', '9') 
    AND g.datum >= '2017-01-01' 
    AND g.oorsprong = 'R' 
    AND g.kstplcode <> 'VPR' 
GROUP BY 
    g.artcode, i.Class_01, i.IsStockItem 
+0

Ist diese Abfrage möglicherweise Teil eines CTE? Oder eine gespeicherte Prozedur? –

Antwort

0

Die berechnete Abfrage aliased zu QISProduct enthält ID-Spalte von zwei Tabellen d.h. QISEventLog und QISProcess. Benenne diese Spalten also in andere Namen um. Aktualisiert Abfrage

 SELECT g.artcode 
      ,sum(g.aantal) 
      ,i.class_01 
      ,i.Isstockitem 
     FROM gbkmut AS g 
     INNER JOIN items AS i ON i.itemcode = g.artcode 
     INNER JOIN (
      SELECT QISP.id 
       ,QISprocess.nml AS Processnml 
       ,QISeventlog.id AS EventLogId 
       ,QISeventlog.dtsample 
       ,QISproduct.nms 
       ,QISbatchlog.nm AS batchnm 
       ,QIStestlog.idvariable 
       ,QIStestlog.no 
       ,QISshortnote.ds 
       ,gewicht = CASE QIStestlog.IDvariable 
        WHEN '139' 
         THEN QIStestlog.no 
        END 
       ,aantal = CASE QIStestlog.IDvariable 
        WHEN '234' 
         THEN QIStestlog.no 
        END 
       ,siloleeg = CASE QIStestlog.idvariable 
        WHEN '23' 
         THEN CASE QIStestlog.no 
           WHEN '10' 
            THEN 'Ja' 
           ELSE 'Nee' 
           END 
        END 
       ,QISvariable.nml variablenml 
       ,gl.nm AS glnm 
       ,QISprocess.id AS ProcessId 
      FROM QIC.Vobra_new2.dbo.production AS QISP 
      INNER JOIN QIC.Vobra_new2.dbo.process AS QISprocess ON QISP.idprocess = QISProcess.id 
      INNER JOIN QIC.Vobra_new2.dbo.product AS QISproduct ON QISP.idproduct = QISproduct.id 
      INNER JOIN QIC.Vobra_new2.dbo.batchlog AS QISbatchlog ON QISP.idbatch = QISbatchlog.id 
      INNER JOIN QIC.Vobra_new2.dbo.eventlog AS QISeventlog ON QISeventlog.idproduction = QISP.id 
       AND QISeventlog.idbatch = QISbatchlog.id 
      INNER JOIN QIC.Vobra_new2.dbo.testlog AS QIStestlog ON QIStestlog.idevent = QISeventlog.id 
      LEFT JOIN QIC.Vobra_new2.dbo.shortnote AS QISshortnote ON QISshortnote.id = QIStestlog.no 
       AND QIStestlog.idvariable = '144' 
      INNER JOIN QIC.Vobra_new2.dbo.variable AS QISvariable ON QISvariable.id = QIStestlog.idvariable 
      LEFT JOIN QIC.Vobra_new2.dbo.vvarxproc AS vvp ON vvp.idvariable = QISvariable.id 
       AND vvp.idprocess = QISP.idprocess 
      LEFT JOIN QIC.Vobra_new2.dbo.attribute AS QISattribute ON QISattribute.id = vvp.idattribute 
      LEFT JOIN QIC.Vobra_new2.dbo.grade AS QISgrade ON QISgrade.id = QISattribute.idgrade 
      LEFT JOIN QIC.Vobra_new2.dbo.gradelevel AS gl ON gl.idgrade = QISattribute.idgrade 
       AND gl.nlevel = QIStestlog.no 
      WHERE QISbatchlog.nm NOT LIKE 'V%' 
       AND QISP.dtstart > '2017-01-01' 
       AND QISP.dtstart < '2017-01-19' 
       AND QISP.idprocess IN (
        '12' 
        ,'13' 
        ,'14' 
        ,'15' 
        ,'16' 
        ,'17' 
        ,'18' 
        ,'41' 
        ) 
       AND QIStestlog.idvariable IN (
        '234' 
        ,'139' 
        ,'128' 
        ) 
      ) QISproduct ON g.artcode = QISproduct.nms 
     WHERE g.bkjrcode > '2015' 
      AND g.reknr IN (
       3000 
       ,3010 
       ,3020 
       ) 
      AND g.aantal > 0 
      AND g.warehouse IN (
       '1' 
       ,'9' 
       ) 
      AND g.datum >= '2017-01-01' 
      AND g.oorsprong = 'R' 
      AND g.kstplcode <> 'VPR' 
     GROUP BY g.artcode 
      ,i.Class_01 
      ,i.IsStockItem 
+0

Thx, es funktioniert (aber Sie wussten das wahrscheinlich schon :-)) –

0

, QISbatchlog.nm Und , gl.nm Haben gleichen Spaltennamen Sie hinzufügen können, als zu colum Namen ändern , gl.nm als col1

0

Sie haben mehrere Probleme in Ihre Anfrage. Sie füllen folgende Spalten mit demselben Spaltennamen in Ihrer inneren Abfrage aus. Verwenden Sie den eindeutigen Namen unter Verwendung von AS-Alias ​​in der inneren Abfrage.

QISP.id 
QISeventlog.id 
QISprocess.id 

gl.nm 
QISbatchlog.nm 

QISprocess.nml 
QISvariable.nml 

Es ist zwingend erforderlich, eindeutige Spaltennamen zurückzugeben durch Auswahlliste in sql.