2016-08-31 2 views
1

zu Netezza DB anzupassen ich Abfrage konvertieren müssen fallowing (wie NOT IN (subquery) wird nicht von Netezza unterstützt):Konvertieren IN Abfrage NICHT LEFT JOIN

UPDATE table1 t1 SET t1.deal_type=t2.deal_type 
FROM table2 t2 
WHERE t1.id_col=t2.id_col 
AND t1.price=t2.price 
AND t1.id_col2=t2.id_col2 
AND t2.price NOT IN (
    SELECT st1.price 
    FROM table1 st1, table2 st2 
    WHERE st1.id_col=st2.id_col 
    AND st1.price=st2.price 
    AND st1.id_col2=st2.id_col2 
    AND st1.id_col=t1.id_col 
    AND t2.deal_type=st2.deal_type 
    GROUP BY st1.id_col, st1.price, st1.id_col2, st2.deal_type 
    HAVING COUNT (*)>1); 

ich mit LEFT versucht JOIN aber nicht alle Datensätze zurückgegeben:

UPDATE table1 t1 SET t1.deal_type = t2.deal_type 
FROM table2 t2 
LEFT JOIN 
    (SELECT st1.price, st1.id_col, st2.deal_type 
    FROM table1 st1, table2 st2 
    WHERE st1.id_col=st2.id_col 
    AND st1.price=st2.price 
    AND st1.id_col2=st2.id_col2 
    GROUP BY st1.id_col, st1.price, st1.id_col2, st2.deal_type 
    HAVING COUNT (*)>1) subq ON (subq.id_col=t1.id_col 
    AND t2.deal_type=subq.deal_type) 
WHERE 
t1.id_col=t2.id_col 
AND t1.price=t2.price 
AND t1.id_col2=t2.id_col2 
subq.price is null 

Alle Vorschläge, bei denen ich falsch lag. oder jede andere Art und Weise NICHT IN Hexe zu arbeiten arround wird nicht von Netezza unterstützt

+0

Sind Sie sicher, dass 'nICHT IN' nicht unterstützt wird (ich würde sehr überrascht sein), oder ist es einfach, dass Sie keine *** korrelierten verwenden *** Unterabfrage mit 'NOT IN'? Großer Unterschied. Was ist die genaue Fehlermeldung, die Sie mit Ihrer ersten Aussage erhalten? – sstan

Antwort

1

Ich glaube, Sie haben vergessen, den Preis hinzufügen in die Linke Join-Bedingung.

wenn es Duplikate für diesen ID & Typen ist, aber mit unterschiedlichem Preis, der NOT-IN Zustand wird passieren, aber die Linke-Mitglied wird (IST NULL) Bedingung

nicht ändert nur

ON (subq.id_col=t1.id_col 
    AND t2.deal_type=subq.deal_type) 

zu

ON (subq.id_col=t1.id_col 
    AND t2.deal_type=subq.deal_type) 
    AND subq.price=t2.price) 
+1

vielen Dank, das hat funktioniert !! Ich war einige Tage darauf festgefahren, ging zurück zu dieser Zeit und fand es nicht heraus. – hidross

0

Können Sie bitte diese versuchen, wenn Netezza Unterstützung vorhanden ist, und Ihre erste Abfrage ist logisch richtig

UPDATE t1 SET t1.deal_type=t2.deal_type 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.id_col=t2.id_col 
    AND t1.price=t2.price 
    AND t1.id_col2=t2.id_col2 
LEFT JOIN (SELECT st1.id_col 
     FROM table1 st1 
     INNER JOIN table2 st2 ON st1.id_col=st2.id_col 
      AND st1.price=st2.price 
      AND st1.id_col2=st2.id_col2 
      AND t2.deal_type=st2.deal_type 
     GROUP BY st1.id_col, st1.price, st1.id_col2, st2.deal_type 
     HAVING COUNT (*)>1) i ON i.id_col=t1.id_col 
WHERE i.id_col IS NULL 
+0

Während Ihr Vorschlag auf Sybase funktioniert, funktioniert er in Netezza nicht. Gleicher Fehler: "Diese Form der korrelierten Abfrage wird nicht unterstützt - erwägen Sie das Umschreiben" – hidross

+0

Bitte überprüfen Sie es mit aktualisierten oben, ich habe es in Join konvertiert. – Susang

+0

Kann nicht die Tabelle t2 in Join-Unterabfrage verwenden (AND t2.deal_type = st2.deal_type) Ich nahm diese Verbindung auf ON-Klausel, aber es gab immer noch etwas andere Anzahl der zurückgegebenen Datensätze. Das gleiche wie mein Versuch mit linken Join – hidross