Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Vereinfachung einer Union Query wegen UniDac Problem (https://www.delphipraxis.net/141415-sql-vereinfachung-einer-union-query-wegen-unidac-problem.html)

alphaflight83 8. Okt 2009 14:59

Datenbank: MySQL • Zugriff über: UniDAC

SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Hallo,
ich habe momentan ein Problem mit einer Union Query, die bei UNIDac einen Assertion Failure verursacht.
Wie im SQL zu sehen, werden die selben Tabellen verwendet, lediglich die WHERE Klauseln unterscheiden,
ob die Werte der Spalten Partial und Total dividiert werden oder nicht.

SQL-Code:
(SELECT
  T1.ID AS Name,
  T1.Partial DIV 3600 AS Partial,
  T1.Total DIV 3600 AS Total,
  T2.Unit AS Unit
FROM Tabelle1 AS T1, Tabelle2 AS T2
WHERE T1.ID = T2.ID
  AND T2.Unit = 'hours')
UNION
(SELECT
  T1.ID AS Name,
  T1.Partial AS Partial,
  T1.Total AS Total,
  T2.Unit AS Unit
FROM Tabelle1 AS T1, Tabelle2 AS T2
WHERE T1.ID = T2.ID
  AND T2.Unit = '')
ORDER BY
  Name ASC
LIMIT 10000
Wie gesagt, verursacht die Abfrage einen UniDac Fehler, im MySQL Query Browser funktioniert sie ohne Probleme.
Meiner Meinung nach wird der Fehler durch das UNION ausgelöst, alle anderen Queries verursachen keine Fehler.
Gibt es vielleicht eine andere Möglichkeit um eine Bedingung in eine Abfrage einzubauen?

Grüße, Alphaflight

Bernhard Geyer 8. Okt 2009 15:05

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Hast du die Query mit Fehlerbeschreibung schon an den Komponentenhersteller gemeldet?

Ansonsten: Wieso gibt es im zweiten Teil keine Spalten-Alias "Name"?

alphaflight83 8. Okt 2009 15:14

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Das fehlende Name war ein Copy Paste Fehler, das muss da natürlich rein.
Ich habs ins DevArt Forum gepostet, bisher aber noch keine Antwort erhalten,
werd ich später/morgen nochmal sehen müssen.

mkinzler 8. Okt 2009 15:14

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Versuche mal explizite Joins

tsteinmaurer 8. Okt 2009 15:15

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Zitat:

Gibt es vielleicht eine andere Möglichkeit um eine Bedingung in eine Abfrage einzubauen?
Ja, wenn z.B. das CASE Konstrukt unterstützt wird.

mkinzler 8. Okt 2009 15:19

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Zitat:

Ja, wenn z.B. das CASE Konstrukt unterstützt wird.
Oder IIF(), IF(), ...

Bernhard Geyer 8. Okt 2009 15:25

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Zitat:

Zitat von alphaflight83
Das fehlende Name war ein Copy Paste Fehler, das muss da natürlich rein.

Und wie schauen die Spaltenbezeichnungen im MySQL Query Browser aus? Du hast ja auch noch unterschiedliche Alias-Reihenfolge was evtl. den MySQL-Server durcheinander bringt.

alphaflight83 8. Okt 2009 15:33

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Unterschiedliche Alias-Reihenfolge? Ich verstehe nicht ...

mkinzler 8. Okt 2009 15:36

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Lass mal das as beim Tabellen-Alias weg

alphaflight83 8. Okt 2009 15:41

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Grade getestet, aber das AS beim Tabellen-Alias hat keine Auswirkung.
Ich probiere grade mal die CASE/IF Sache aus ...

hoika 8. Okt 2009 16:33

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Hallo,

geht denn folgendes ?

SQL-Code:
(SELECT
  T1.ID AS Name,
  T1.Partial DIV 3600 AS Partial,
  T1.Total DIV 3600 AS Total,
  T2.Unit AS Unit
FROM Tabelle1 AS T1, Tabelle2 AS T2
WHERE T1.ID = T2.ID
  AND T2.Unit = 'hours')
UNION
(SELECT
  T3.ID AS Name,
  T3.Partial AS Partial,
  T3.Total AS Total,
  T4.Unit AS Unit
FROM Tabelle1 AS T3, Tabelle2 AS T4
WHERE T3.ID = T4.ID
  AND T4.Unit = '')
ORDER BY
  T3.ID ASC
LIMIT 10000

Heiko

shmia 8. Okt 2009 16:39

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Just for Info:
UNION ALL arbeitet schneller als UNION, weil der Server doppelte Datensätze nicht aus dem Ergebnis entfernen muss.
(bei deiner Abfrage sind doppelte Datensätze eh ausgeschlossen)

Ausserdem, hast du Beitrag #4 beachtet?
SQL-Code:
SELECT
  T1.ID AS Name,
  T1.Partial DIV 3600 AS Partial,
  T1.Total DIV 3600 AS Total,
  T2.Unit AS Unit
FROM Tabelle1 T1 INNER JOIN Tabelle2 T2 ON T1.ID = T2.ID
WHERE T2.Unit = 'hours'
UNION ALL
SELECT
  T1.ID AS Name,
  T1.Partial AS Partial,
  T1.Total AS Total,
  T2.Unit AS Unit
FROM Tabelle1 T1 INNER JOIN Tabelle2 T2 ON T1.ID = T2.ID
WHERE T2.Unit = ''
ORDER BY Name ASC
Und lass mal die Limit-Klausel weg...

omata 8. Okt 2009 21:24

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Warum so kompliziert?

SQL-Code:
SELECT t1.id AS name,
       CASE WHEN t2.unit = 'hours'
         THEN t1.partial DIV 3600 
         ELSE t1.partial
       END AS partial,
       CASE WHEN t2.unit = 'hours'
         THEN t1.total DIV 3600 
         ELSE t1.total
       END AS total,
       t2.unit AS unit
FROM tabelle1 t1
INNER JOIN tabelle2 t2
  ON t1.id = t2.id
ORDER BY name LIMIT 10000

alphaflight83 9. Okt 2009 07:59

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
tsteinmaurers bzw. Omatas Vorschlag funktioniert wunderbar.
Anscheinend hat UniDac wirklich Probleme mit UNION,
da alle anderen Vorschläge den gleichen Fehler zur Folge hatten.

Danke an alle, es ist einfach Spitze wie schnell man hier Hilfe bekommt.
:dp:

mkinzler 9. Okt 2009 08:03

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Wobei das genau die Lösung war, welche Thomas unter #5 vorgeschlagen hat

alphaflight83 9. Okt 2009 08:33

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Jo, ich hatte mir das auch schon angeschaut,
Omata hat es hier aber mustergleich präsentiert,
weswegen ich auf seinen Eintrag verwiesen habe.
(Edit: vorherigen Post editiert)

tsteinmaurer 9. Okt 2009 11:56

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Hallo Markus,

richtig, aber ich war zu faul ein lauffähiges Beispiel zu liefern. :-D

mkinzler 9. Okt 2009 12:01

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Es ist immer die Frage, wer der jenige seis sollte, der sich die Mühe macht, der Fragesteller oder der Helfende :zwinker:

omata 11. Okt 2009 19:39

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Ohne hier jetzt eine Diskussion starten zu wollen...

Es ist hier also nicht erwünscht konkrete Beispiele zu liefern, es sei denn man ist der der das Problem hat und die Frage formuliert hat?

Es ist nicht erlaubt Befehle, Ideen oder sonst etwas aus vorherigen Posts zu entnehmen, diese zu erweitern oder zu konkretisieren?

Schade, dass man diese Schlussfolgerungen aus dieser Diskussion ziehen muss, naja ich habe diese Anmerkungen zur Kenntnis genommen und werde (versuchen) mich in Zukunft dran zuhalten.

Ihr schafft es immer wieder einem jegliche Illusionen zu nehmen, das ist echt schade...

tsteinmaurer 11. Okt 2009 19:45

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Omata,

du hast meine vollständige Unterstützung, wenn du lauffähige Beispiele postest. In der Regel mach ich das auch, aber diesmal halt nur der Hinweis auf CASE, um den Originalposter auf die richige Fährte zu bringen.

Also, nur weiter so und feel free, vollständige Lösungen zu posten.

mkinzler 11. Okt 2009 20:28

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Sorry, wenn ich hier missverstanden wurde. natürlich darfst du hier gerne hier fertige Lösungen posten.
Ich meinte nur, das hier niemnad verpflichtet dazu ist.
Ich habe vielleicht noch etwas die Illusion, das Hilfe zu Selbsthilfe der bessere Weg ist, wurde aber schon weitesgehends davon kuriert. Meine Aussage ist auch meine private Meinung und kein offizielles Statement als Teammitglied.

alphaflight83 12. Okt 2009 08:03

Re: SQL Vereinfachung einer Union Query wegen UniDac Problem
 
Um hierzu nochmal was zu sagen,
ich hatte nach tsteinmaurers Beitrag die CASE Anweisung schon lauffähig,
allerdings nur ohne Alias, da ich nicht wusste, wo der beim CASE platziert werden muss.
Da ich auf den Alias angewiesen bin und Omatas Beitrag mir noch die Lösung hierzu geliefert hat,
habe ich anfänglich nur auf diesen verwiesen, da für evtl. zukünftige Suchende das eben die fertige Lösung darstellt.
Für mich gilt, dass ich aus diesem Thread einiges lernen konnte,
eben auch aus den Beiträgen, die jetzt nicht direkt zur Lösung beigetragen haben (Stichwort: schnelleres Query durch UNION ALL)
was doch auch der Sinn des Ganzen sein sollte.
Kurzum: Als Suchender ist man für jede Hilfe dankbar, ein Beispiel kann aber noch dazu Zeit sparen und
gerade bei zickigen SQL-Abfragen, ist manchmal ein gut formuliertes Beispiel die beste Hilfe zur Selbsthilfe.

Gruß, Alphaflight


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz