2016-05-31 15 views
-1

Neugierig, wenn jemand eine Anleitung zum Einrichten dieser SQL-Abfrage bereitstellen kann. Ich habe eine ERP-Datenbank und es gibt viele Transaktionsdatensätze. Wenn ein Artikel eine bestimmte Art von Vorgangsart hat, "Stücklistenausgabe", wird er mit einer eindeutigen Transaktions-ID protokolliert. Ex. 12345. Transaktions-IDs werden nacheinander protokolliert. Die nächste Transaktion lautet also 12346. Wenn ich nach einem Teil suche, wird festgestellt, dass dieser Artikel eine BOM-Issue-Transaktion hat. Ich möchte, dass meine SQL-Abfrage mit ihrer Transaktions-ID beginnt und diese Transaktionsdatensätze durchsucht, indem die Transaktions-ID dekrementiert wird. Es muss sequentiell durchlaufen werden, bis es einen Transaktionsdatensatz für ein Teil erreicht, das die Vorgangsart "Stückliste" hat.SQL-Crawler mit IDs

Hier ist ein visueller. Ich suche nach dem gelben Teil und möchte die Ergebnisse des grünen Teils.

enter image description here

+0

So ist die Abfrage nur den ersten BOM Eingangs zur BOM Ausgabe vor der Rückkehr? Wenn nicht, dann müssen Sie erklären, wie die Beziehung zwischen "Child Part 10" und "Parent Part" ist. – DeanOC

+2

Warum muss es sequenziell crawlen? Sequenzielle/iterative Operationen sind Anti-Muster in einem relationalen db-System. – squillman

+0

@DeanOC ja, genau das. – Nicho247

Antwort

0
SELECT MAX(id) FROM transactions WHERE type = 'BOM receipt' AND id < 12345 

Edit (Beantwortung der Kommentar):

Nun, Sie einfach könnte über alle IDs in der Anwendungsschicht zu durchlaufen wollen und über Abfrage verwenden ...

Eine SQL-Lösung für:

SELECT * FROM transactions t1, transactions t2 
    WHERE t1.type = 'BOM receipt' AND t2.type = 'BOM Issue' 
    AND t2.id > t1.id 
    AND (
     t2.id < (
      SELECT MIN(id) FROM transactions 
      WHERE type = 'BOM receipt' AND id > t1.id) 
     OR NOT EXISTS (
      SELECT id FROM transactions 
      WHERE type = 'BOM receipt' AND id > t1.id) 
    ) 

Hiermit wird die Quittung für ein Problem ausgewählt. Sie können nur bestimmte Spalten auswählen (z. B. t1.id, t2.id), und Sie können zusätzliche Bedingungen hinzufügen: AND t2.id = firstWantedId AND t2.id = secondWantedId, um nur die gewünschten IDs zu erhalten, und wenn Sie die Ergebnisse sortiert benötigen, fügen Sie ORDER BY t1.id, t2.id hinzu.

Es gibt möglicherweise noch Potenzial zu optimieren, aber zumindest funktioniert es ...

+0

Gibt ID <1235 nicht etwas zu spezifisch an? Ich vermute, das OP ist nach einer allgemeineren Lösung. – DeanOC

+0

Ich nahm an, dass die ID dem OP aus welchem ​​Grund auch immer bekannt ist und er sie entsprechend ersetzen kann (z. B. eine vorbereitete Anweisung mit 'AND id Aconcagua

+0

@Aconcagua hmmmm .... das ist interessant. Das muss ich morgen (schon zu Hause) testen. Wenn Sie mit der Fertigung vertraut sind, wird es viele Stücklistenbelege geben, und bei der Suche nach einem Teil wird es auch viele Instanzen von Stücklistenausgaben (über verschiedene Zeitstempel) geben. Wie würde ich das ändern, um etwas dynamischer zu sein? Sagen Sie zum Beispiel, der Teil, den ich suchte, hatte 5 Instanzen zufällig IDs. – Nicho247