Wert aus derselben Tabelle Suchen - ergibt zu viele Ergebnisse

Firelady1988

Benutzer
Beiträge
10
Hallo liebe Leute,

ich bin neu hier und gerade dabei mein erstes Projekt fertigzustellen und scheitere gerade an zwei Fragen. Ich habe eine Tabelle mit Produktionsaufträgen, und eine mit den dazugehörigen Schrittfolgen.

1) Ich muss, aus der Tabelle Auftragsdaten, die Kesseltemperatur finden. Diese soll in der Tbl Aufträge eingefügt werden. (Meinen nicht funktionierenden Code (er gibt immer 2 Zeilen aus und berücksichtigt scheinbar die Suchbegriffe nicht?) habe ich unter den Tabellen angefügt.

2) als zweites benötige ich zur jeweiligen Batch_ID und zum Auftrag die Aufheizzeit (Kessel Ende aufheizen - Kessel Start aufheizen)


Tbl Auftraege (so soll es dann am Ende aussehen, die beiden Spalten Temperatur und aufheizzeit sollen angefügt werden:)
LinieAuftragBatch_IDMaterialKurztextKesseltemperaturAufheizzeit
1471111234Pizzasoße80°C10 min
1471121234Pizzasoße85°C12 min
1471211235Pizzateig

Tbl Auftragsdaten
LinieZeitstempelAuftragBatch_IDMaterialKurztextSchrittWert
12023-12-31 09:01471111234PizzasoßeKessel Start aufheizen1
12023-12-31 09:11471111234PizzasoßeKessel Ende aufheizen1
12023-12-31 09:12471111234PizzasoßeKesseltemperatur80°C
12023-12-31 09:20471121234PizzasoßeKessel Start aufheizen1
12023-12-31 09:32471121234PizzasoßeKessel Ende aufheizen1
12023-12-31 09:31471121234PizzasoßeKesseltemperatur85°C
22023-12-31 10:00471211235PizzteigZutaten abwiegen1

Hier der Code zur Frage 1):
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT
[Linie],
[Auftrag],
[Batch_ID],
[Material],
[Kurztext],

(SELECT --Kesseltemperatur
Auftragsdaten1.[Auftrag],
Auftragsdaten1.[Batch_ID],
Auftragsdaten1.[Kurztext],
Auftragsdaten1.[Wert]

FROM Auftragsdaten as Auftragsdaten1
JOIN Auftragsdaten as Auftragsdaten2
ON Auftragsdaten2.[Auftrag]=Auftragsdaten1.[Auftrag] and Auftragsdaten2.[Batch_ID]=Auftragsdaten1.[Batch_ID]
WHERE Auftragsdaten1.[Schritt]='Kesseltemperatur')

FROM [Test].[dbo].[AUFTRAEGE]
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Ich danke euch vielmals für eure Mühe :)
 
Werbung:
er gibt immer 2 Zeilen aus und berücksichtigt scheinbar die Suchbegriffe nicht?

Da Du 2x auf Auftragsdaten joinst, aber nur einmal die Menge auf "Kesseltemperatur" einschränkst, hast Du ein "loses Ende", alle Kesseltemperatur Matches werden zurück geliefert. (gäbe es mehr Arbeitsschritte, bekämst Du noch mehr Daten zurück)

Du kannst entweder den Join erweitern und die Spalte Schritt ebenfalls joinen auf Gleichheit. Dann reicht eine einzige Einschränkung in der Where Clause auf 'welche Schritte sollen ausgegeben werden'.
Oder Du musst in der Where Clause 2x auf den gleichen Schritt einschränken, was ich etwas schräg(er) fände als den (immer richtigen) Join auf "Schritt" zu erweiteren (alles andere wäre vielleicht Unsinn) und dann die benötigten Kriterien zu filtern, die ausgegeben werden sollen.

Die 2. Frage schaffst Du mit der Reparatur des 1. Statements dann bestimmt. Wenn nicht, melde Dich.
 
Hey dabadepdu danke für deine Antwort. Leider bringen beide Versionen nicht das gewünschte Ergebnis. Es kommt weiterhin die Fehlermeldung:
Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.

Eben hatte ich noch eine andere Meldung:
"Nur ein einziger Ausdruck kann in der Auswahlliste angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird."
Die lag aber daran, dass ich nicht nur den Wert ausgegeben hatte, sondern mehrere Spalten. Das ist jetzt korrigiert.

Da muss noch woanders ein Fehler sein und ich finde ihn nicht :-(
 
So ?
Code:
select *
from Auftraege as af
     inner join
     Auftragsdaten as ad on af.Auftrag = ad.Auftrag and af.Batch_ID = ad.Batch_ID
where ad.schritt = 'kesseltemperatur'
 
Leider bringen beide Versionen nicht das gewünschte Ergebnis.
Ah, ich war etwas schlampig. Hab gar nicht realisiert, dass der Code ein einziges Statement sein soll.

Deiner Abfrage:
Code:
SELECT [ Linie ],
       [ Auftrag ],
       [ Batch_ID ],
       [ Material ],
       [ Kurztext ],
       (SELECT --Kesseltemperatur
         Auftragsdaten1. [ Auftrag ],
         Auftragsdaten1. [ Batch_ID ],
         Auftragsdaten1. [ Kurztext ],
         Auftragsdaten1. [ Wert ]
          FROM Auftragsdaten as Auftragsdaten1
          JOIN Auftragsdaten as Auftragsdaten2
            ON Auftragsdaten2. [ Auftrag ] = Auftragsdaten1. [ Auftrag ]
           and Auftragsdaten2. [ Batch_ID ] = Auftragsdaten1. [
         Batch_ID ]
         WHERE Auftragsdaten1. [ Schritt ] = 'Kesseltemperatur')
  FROM [ Test ] . [ dbo ] . [ AUFTRAEGE ]
fehlt neben meinen ersten Anmerkungen auch noch eine Verknüpfung zwischen dem inneren Select und dem äußern (Aufträge)
So werden für jeden Auftrag alle gültigen Daten aus dem inneren Statement geliefert, das passt nicht zusammen.

Diese Form von inneren Selectstatements sollte man vermeiden. Meistens unperformant. Ich sag mal, schlechter Stil. Außerdem eigentlich (fast) nie nötig.

Wenn, dann wäre es mit Deinem Ansatz glaub ich so (ungetestet):
Code:
SELECT [ Linie ],
       [ Auftrag ],
       [ Batch_ID ],
       [ Material ],
       [ Kurztext ],
       (SELECT --Kesseltemperatur
         Auftragsdaten1. [ Auftrag ],
         Auftragsdaten1. [ Batch_ID ],
         Auftragsdaten1. [ Kurztext ],
         Auftragsdaten1. [ Wert ]
          FROM Auftragsdaten as Auftragsdaten1
          JOIN Auftragsdaten as Auftragsdaten2
            ON Auftragsdaten2. [ Auftrag ] = Auftragsdaten1. [ Auftrag ]
           and Auftragsdaten2. [ Batch_ID ] = Auftragsdaten1. [Batch_ID ]
           and Auftragsdaten2. [ Schritt ] = Auftragsdaten1. [ Schritt ]  -- also plus 3. Join-Kriterium über Spalte Schritt
         WHERE Auftragsdaten1. [ Schritt ] = 'Kesseltemperatur')
              and Auftragsdaten1. [ Auftrag ] = Auftraege. [ Auftrag ]  -- Filterung des inneren Ergebnis auf Auftrag
              and Auftragsdaten1. [ Batch_ID ] = Auftraege. [ Batch_ID ]  -- und Batch_ID
  FROM [ Test ] . [ dbo ] . [ AUFTRAEGE ]

Man würde es aber eher so machen (ungetestet):
Code:
SELECT [ Linie ],
       [ Auftrag ],
       [ Batch_ID ],
       [ Material ],
       [ Kurztext ],
      ad.wert as Kesseltemperatur
  FROM [ Test ] . [ dbo ] . [ AUFTRAEGE ] a
join
       (SELECT --Kesseltemperatur
         Auftragsdaten1. [ Auftrag ],
         Auftragsdaten1. [ Batch_ID ],
         Auftragsdaten1. [ Kurztext ],
         Auftragsdaten1. [ Wert ]
          FROM Auftragsdaten as Auftragsdaten1
          JOIN Auftragsdaten as Auftragsdaten2
            ON Auftragsdaten2. [ Auftrag ] = Auftragsdaten1. [ Auftrag ]
           and Auftragsdaten2. [ Batch_ID ] = Auftragsdaten1. [Batch_ID ]
           and Auftragsdaten2. [ Schritt ] = Auftragsdaten1. [ Schritt ]  -- also plus 3. Join-Kriterium über Spalte Schritt
         WHERE Auftragsdaten1. [ Schritt ] = 'Kesseltemperatur'
              and Auftragsdaten1. [ Auftrag ] = Auftraege. [ Auftrag ]       -- Filterung des inneren Ergebnis auf Auftrag
              and Auftragsdaten1. [ Batch_ID ] = Auftraege. [ Batch_ID ] ) ad  -- und Batch_ID
    on a.auftrag = ad.auftrag and a.Batch_ID = ad.Batch_ID

Analog dann zum zweiten benötigten Wert.

Das Ganze kann man dann noch mit einer CTE für die Auftragsdaten schneller und eleganter machen.
 
Werbung:
Haha ok, danke, das ist die früheste Auszeichnung des Jahres in meinem ganzen Leben. 😊

Ich krempel mir sogar beim Schwimmen die Ärmel hoch, ganz zwanglos .. wird schon schief gehn!

Es hat perfekt funktioniert.


Tu Dir einen kleinen Gefallen und schau Dir beide Varianten im Ausführungsplan / Kosten an.
Oder, wenn Du viele Daten hast, dann lass die beiden Varianten des Statements Inline/Join gegeneinander im Rennen laufen (mit genügend Datensätzen).

Ein solches Inlinestatement scheint intuitiv / bequem, aber es ist wie einen Hund gegen den Strich zu bürsten. Für jede Ergebniszeile wird das Inline Statement separat aufgerufen.
Eine Ergebniszeile sind also wie 2 Abfragen, 100 Ergebniszeilen sind wie 101 Abfragen, 1000 wie .. usw.
Ich will nicht ausschließen, dass es mittlerweile Systeme gibt, die das intern intelligent umformen zu einem ordentlichen Join. Im Zweifel merkt man es am Ausführungsplan oder bei der Laufzeit in großen Datenmengen ziemlich einfach.
 
Zurück
Oben