| 

.NET C# Java Javascript Exception

2
Hallo,

versuche schon seit geraumer Zeit folgende - auf den ersten Blick einfache - Information aus einer Tabelle zu erhalten:
- Sortierung nach "b" (bei Tabelle A aufwärts, bei Tabelle B abwärts)
- Alle "u" mit einem bestimmten Wert erscheinen zuerst (im Beispiel u=3) - danach ist die Reihenfolge unwichtig
- N (NULL) immer am Ende
- kein "r" darf doppelt vorkommen (aber alle verschiedenen "r" müssen vorhanden sein)

Mit "ORDER BY IFNULL(u, 99999999) != 3 , u , b" gelingt mir schon mal Kriterium 1, 2 und 3, aber beim Letzten beiße ich mir die Zähne aus.
Mit DISTINCT erreiche ich das Ziel nicht, genauso wenig wie mit GROUP BY.

Hat jemand ne Idee, die mich weiter bringen kann?

Vielen Dank schon mal im voraus!

Viele Grüße


Ausgangstabelle      Zieltabelle A 
+----------------+ +----------------+
| id | r | u | b | | id | r | u | b |
+----------------+ +----------------+
| 1 | 1 | 1 | 9 | | 18 | 5 | 3 | 1 |
| 2 | 1 | 3 | 4 | | 2 | 1 | 3 | 4 |
| 3 | 1 | 4 | 6 | | 15 | 4 | 3 | 7 |
| 4 | 1 | 5 | 5 | | 11 | 3 | 3 | 8 |
| 5 | 2 | 1 | 2 | | * | 2 | * | * |
| 6 | 2 | 2 | 1 | | 21 | 6 | N | N |
| 7 | 2 | 4 | 5 | +----------------+
| 8 | 2 | 5 | 7 |
| 9 | 3 | 1 | 4 |
| 10 | 3 | 2 | 3 |
| 11 | 3 | 3 | 8 |
| 12 | 3 | 5 | 2 | Zieltabelle B
| 13 | 4 | 1 | 3 | +----------------+
| 14 | 4 | 2 | 2 | | id | r | u | b |
| 15 | 4 | 3 | 7 | +----------------+
| 16 | 4 | 4 | 6 | | 11 | 3 | 3 | 8 |
| 17 | 5 | 2 | 9 | | 15 | 4 | 3 | 7 |
| 18 | 5 | 3 | 1 | | 2 | 1 | 3 | 4 |
| 19 | 5 | 4 | 6 | | 18 | 5 | 3 | 1 |
| 20 | 5 | 5 | 4 | | * | 2 | * | * |
| 21 | 6 | N | N | | 21 | 6 | N | N |
+----------------+ +----------------+
News:
11.04.2016
seamanx 3 1
1 Antwort
1
Leider unterstützt MySql keine Tabellenfunktionen (zumindest soweit mir bekannt).
Deshalb hier zunächst eine SQL-Anweisung, die die gewünschten Daten liefert:
select CAST(id as nvarchar), CAST(r as nvarchar), cast(u as nvarchar), CAST(b as nvarchar) 
from Ausgangstabelle
where (u=3 OR u IS NULL)
UNION
SELECT '*', r, '*', '*'
FROM Ausgangstabelle
WHERE Ausgangstabelle.r not in (SELECT DISTINCT r FROM Ausgangstabelle where (u=3 OR u IS NULL))

Ich habe die Syntax vom SQL-Server verwendet. Sie sollte sich auf MySql übertragen lassen.
Die Idee: Zunächst alle "echten" Daten aus der Ausgangstabelle sammeln und danach in der UNION mit den fehlenden r-Werten verbinden.

Wenn man das Ganze in eine temporäre Sicht verwandelt, sollte auch die Sortierung möglich sein.

Meine Empfehlung wäre allerdings, das Ganze in einer Methode im Client zu machen und über eine Collectionklasse zu gehen. Da wäre man deutlich flexibler.

Vielleicht helfen die Anregungen weiter.
12.04.2016
edvservice 1,2k 6
Vielen Dank für die hilfreichen Anregungen.
UNION und vor allem WHERE NOT IN waren für mich die richtigen Schlüsselwörter.
Habe am Ende noch ORDER BY u != 3, u, b benutzt um die Sortierung zu realisieren.
seamanx 13.04.2016

Stelle deine --Frage jetzt!