Du bist nicht angemeldet.

Starkstroemer

Registrierter Benutzer

  • »Starkstroemer« ist der Autor dieses Themas

Beiträge: 79

Dabei seit: 3. März 2008

Wohnort: an der Küste

  • Private Nachricht senden

1

Montag, 30. August 2010, 10:54

Bestimmte ID abfragen (MSSQL)

Hallo,

ich habe ein Produkt, was während seiner Herstellung 3 Stationen durchläuft. An jeder Station bekommt das Produkt einen Datum-Zeit Stempel. Um es eindeutig in der Datenbank identifizieren zu können, ist in jedem DB-Eintrag zum aktuellen Stempel auch der, der 1. Station mit eingefügt.
D.h. das ich nach Fertigstellung des Produktes immer 3 Einträge zu einem Produkt habe, welche alle eine gleiche IdentID haben und dazu jeweils einen Datum-Zeit Stempel der Station bekommen.

Jetzt zu meinem Problem:

Ich möchte aus der ganzen Tabelle immer die Einträge abfragen, welche nur als ProzessID die Zahl 1 haben (jeder Eintrag mit einer 1 hat natürlich auch die 0) und noch keine 2. Das bekomme ich nicht hin. Weiß hier jemand Rat?

Als Beispiel mal ein Auszug aus der Tabelle.
»Starkstroemer« hat folgendes Bild angehängt:
  • ID.JPG
Wenn die Zeit kommt in der man könnte, ist die vorrüber in der man kann.

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

2

Montag, 30. August 2010, 11:03

Um es eindeutig in der Datenbank identifizieren zu können, ist in jedem DB-Eintrag zum aktuellen Stempel auch der, der 1. Station mit eingefügt.

Merkwürden Disein ...


So aus dem Stehgreif würde ich jetzt mal sagen:

SELECT IdentID, Max(ProzessID) AS MaxPro FROM tabelle GROUP BY IdentID HAVING MaxPro = 1

oder so ähnlich. Der Trick dürfte jedenfalls das "GROUP BY" sein, denn da kannst du dann ja anhand des "eindeutigen" Timestamps gruppieren.
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Chris213

Registrierter Benutzer

  • »Chris213« ist männlich

Beiträge: 1 003

Dabei seit: 29. März 2009

Wohnort: Wutöschingen

Hilfreich-Bewertungen: 27

  • Private Nachricht senden

3

Montag, 30. August 2010, 11:33

das kannst du kans einfach mit einer where abfrage bewerkstelligen:

Visual Basic Quellcode

1
.commandtext = "SELECT * FROM Tabellenname WHERE ProzessID = 1"


Jetzt werden nur alle Einträge geladen die eine 1 haben.
Mfg chris213

Meine Finanzen LeitSim4

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

4

Montag, 30. August 2010, 11:44

Jetzt werden nur alle Einträge geladen die eine 1 haben.

spitzenidee. Leider nicht das was er wollte, denn so werden ja auch Stücke selektiert, die außer 1 auch ne 2 haben ...
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Chris213

Registrierter Benutzer

  • »Chris213« ist männlich

Beiträge: 1 003

Dabei seit: 29. März 2009

Wohnort: Wutöschingen

Hilfreich-Bewertungen: 27

  • Private Nachricht senden

5

Montag, 30. August 2010, 11:48

wie außer ne 1 auch ne 2 haben.

Ich habe das so verstanden, das wenn ein Arbeitsgang beendet ist die ProzessID um 1 erhöht wird und da kommt dann keine 1 bei einem 2 Eintrag vor
Mfg chris213

Meine Finanzen LeitSim4

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

6

Montag, 30. August 2010, 11:51

Ich habe das so verstanden

Schau dir hatl das Bild der Tabelle an, das er angehängt hat. Dann siehst du das Problem.
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Starkstroemer

Registrierter Benutzer

  • »Starkstroemer« ist der Autor dieses Themas

Beiträge: 79

Dabei seit: 3. März 2008

Wohnort: an der Küste

  • Private Nachricht senden

7

Montag, 30. August 2010, 12:52

So aus dem Stehgreif würde ich jetzt mal sagen:

SELECT IdentID, Max(ProzessID) AS MaxPro FROM tabelle GROUP BY IdentID HAVING MaxPro = 1


Hallo Picoflop,

er mault mir im Moment den MaxPro an, warum auch immer...

Zitat

Ungültiger Spaltenname 'MaxPro'.


Aber so wie Du mich verstanden hast, meinte ich es auch. Vielen Dank Dir schon mal für Deine Unterstützung!
Wenn die Zeit kommt in der man könnte, ist die vorrüber in der man kann.

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

8

Montag, 30. August 2010, 13:05

warum auch immer...

Versteht nicht, dass es ein "neuer" Spaltenname ist.

So müsste auch gehen:
SELECT IdentID FROM Tabelle GROUP BY IdentID HAVING MAX(ProcessID) = 1;
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp

Starkstroemer

Registrierter Benutzer

  • »Starkstroemer« ist der Autor dieses Themas

Beiträge: 79

Dabei seit: 3. März 2008

Wohnort: an der Küste

  • Private Nachricht senden

9

Montag, 30. August 2010, 13:50

Lösung

Hallo,

für alle die es evtl. mal interessieren könnte oder aber die genau dieses Problem auch haben hier mal die Lösung:

Zitat

select * from Tabelle
where ProzessID = 1 and IdentID not in (select IdentID from Tabelle where ProzessID = 2)


Vielen Dank nochmal an Picoflop für Deine Unterstützung!!!
Wenn die Zeit kommt in der man könnte, ist die vorrüber in der man kann.

picoflop

Böse und gemein!

Beiträge: 5 843

Dabei seit: 19. März 2009

Hilfreich-Bewertungen: 546

  • Private Nachricht senden

10

Montag, 30. August 2010, 13:56

oder aber die genau dieses Problem auch haben hier mal die Lösung:

Geht. Sehr unperformant, aber geht ;)
Das Konstrukt mit "NOT IN (SELECT ...)" sollte man nur machen, wenn's um wenige Datensätze geht. Bei vielen DS geht das doch sehr langsam, weil er ja für jeden DS ganz viele Vergleiche machen muss.
Von Hilfeanfragen via PN ist ABZUSEHEN!


GUI - Threading Best Of - Async - x64 Excp