union select liefert nur jeden gleichen Datensatz einmal ...

Traceman

Benutzer
Beiträge
9
Hallo,

ich habe eine einfache Abfrage zum Zusammenfügen von 2 Tabellen mit einem Datum und der Dauer. Nach dem Abfrage fehlen aber alle Einträge die schon mal da sind. Die Abfrage scheint ein "group by ..." zu beinhalten.

Wie kann ich das verhindern, allo alle Zeilen erhalten?

Hardy

Code:
select * from t1;
+------------+----------+
| start      | duration |
+------------+----------+
| 2022-07-22 |    25800 |
| 2022-08-07 |    14400 |
| 2022-08-08 |     3600 |
| 2022-08-08 |     3600 |
| 2022-08-08 |     3600 |
+------------+----------+
5 rows in set (0.001 sec)

select * from t2;
+------------+----------+
| start      | duration |
+------------+----------+
| 2022-07-23 |        0 |
| 2022-08-08 |    21600 |
| 2022-08-09 |        0 |
| 2022-08-09 |        0 |
| 2022-08-09 |        0 |
+------------+----------+
5 rows in set (0.001 sec)

select * from t1 union select * from t2;
+------------+----------+
| start      | duration |
+------------+----------+
| 2022-07-22 |    25800 |
| 2022-08-07 |    14400 |
| 2022-08-08 |     3600 |
| 2022-07-23 |        0 |
| 2022-08-08 |    21600 |
| 2022-08-09 |        0 |
+------------+----------+
6 rows in set (0.001 sec)

Code:
status
--------------
mysql  Ver 15.1 Distrib 10.5.15-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper

Connection id:          10308
Current database:       test
Current user:           hardy@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         10.5.15-MariaDB-0+deb11u1 Debian 11
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8
Conn.  characterset:    utf8
 
Werbung:
Erstmal füge ich noch ein Feld ein, aber es sollte doch eine andere Lösung geben ...

Code:
select *,rand() as r from t1 union select *,rand() from t2;
+------------+----------+----------------------+
| start      | duration | r                    |
+------------+----------+----------------------+
| 2022-07-22 |    25800 |   0.8999154287389624 |
| 2022-08-07 |    14400 |   0.7674013076046494 |
| 2022-08-08 |     3600 |  0.13726028254000497 |
| 2022-08-08 |     3600 |  0.38409752061972163 |
| 2022-08-08 |     3600 |   0.5087067862122383 |
| 2022-07-23 |        0 |   0.3912413999356715 |
| 2022-08-08 |    21600 |  0.43008667177528764 |
| 2022-08-09 |        0 |   0.9767091898030688 |
| 2022-08-09 |        0 |   0.5932859644231255 |
| 2022-08-09 |        0 | 0.036302283440066765 |
+------------+----------+----------------------+
10 rows in set (0.006 sec)
 
UNION gruppiert automatisch identische Zeilen.
Nimm statt dessen UNION ALL, das einfach alles aneinanderhängt. (Ist schneller, muss nicht nachdenken, kann aber viel größere Ergebnisse zeitigen mit sehr vielen Dubletten > doch wieder langsamer, naja, natürlich nicht mehr als die Summe der vorhandenen Datensätze in den beteiligten Tabellen)
 
Werbung:
Hallo dabadepdu,

vielen Dank für den Hinweis, da habe ich die Beschreibung nicht richtig gelesen. Dieses Verhalten kannte ich noch nicht. Aber mit "ALL" ist alles ok.

Hardy
 
Zurück
Oben