Union All bez duplikatów z zachowaniem ORDER BY

0

Cześć,

mam tabelę tablocaldefinition :

CREATE TABLE tablocaldefinition (
	"name" text NULL
);

INSERT INTO tablocaldefinition ("name") VALUES(''Tab local definition");
INSERT INTO tablocaldefinition ("name") VALUES(''Tab local definition");

mam tutaj duplikat specjalnie dodany

Teraz mam drugą tabelę sapinstanceNumbers:

CREATE TABLE .sapinstancenumbers (
        MinNumber as int,
       MaxNumber as int
);

INSERT INTO sapinstancenumbers (MinNumber) VALUES(0);
INSERT INTO sapinstancenumbers (MaxNumber) VALUES(97);

I teraz aby zrobić aby Tab local definition było pierwsze w kwarendzie wynikowej oraz aby połączyć te tabele mam SQLka (tworzy array od 0 do 97 - listę którą dołączam do Tab local definition).

SELECT t1.Name AS ServerNumber FROM TabLocalDefinition AS t1
UNION ALL
SELECT ServerNumber::TEXT
FROM SAPInstanceNumbers AS t1
CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber

wynik powinien być taki:

ServerNumber
Kolumna1
Tab local definition
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

Problem jest taki, że mam duplikaty.
Nie mogę użyć union bo union nie zachowuje ORDER (porządku).

Jak sobie z tym poradzić?
Proszę o pomoc,
Jacek

1

Zrobić z tego podzapytanie dodać pseudo kolumnę odpowiedzialną za sortowanie.

0

Czesc,

dziękuje.
Nie działa:

SELECT ServerNumber
FROM
(SELECT 1 AS lvl, t1.Name AS ServerNumber FROM TabLocalDefinition AS t1
UNION ALL
SELECT 2 AS lvl, ServerNumber::TEXT
FROM SAPInstanceNumbers AS t1
CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber) AS t2
ORDER BY lvl

Jak daje union to order jest calkowicie popsuty...

0
select ServerNumber  from (
sELECT t1.Name AS ServerNumber,  0 col_ord  FROM TabLocalDefinition AS t1
UNION ALL
SELECT ServerNumber::TEXT,   1 col_ord
FROM SAPInstanceNumbers AS t1
CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber )
order by col_ord , ServerNumber

Nie testowałem moga byc literówki

0

Ok dziekuje.

Wlasnie nie działa, order mi niszczy całkiem plus nie niweluje duplikatów.

SELECT ServerNumber
FROM
(SELECT t1.Name AS ServerNumber, 0 AS lvl FROM TabLocalDefinition AS t1
UNION ALL
SELECT ServerNumber::TEXT, 1 AS lvl
FROM SAPInstanceNumbers AS t1
CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber) AS t2
ORDER BY lvl, ServerNumber

taki wynik z powyższego:
Screenshot_149.png

1

@jaryszek: Bo skonwertowałeś na text to ci sortuje jak ciągi znakowe. Spróbuj tak

select ServerNumber  from (
sELECT t1.Name AS ServerNumber,  -1 col_ord  FROM TabLocalDefinition AS t1
UNION ALL
SELECT ServerNumber::TEXT,   ServerNumber col_ord
FROM SAPInstanceNumbers AS t1
CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber )
order by col_ord 
0

@UglyMan: bardzo dziękuję.

SELECT ServerNumber
FROM
(SELECT t1.Name AS ServerNumber, -1 AS lvl FROM TabLocalDefinition AS t1
UNION ALL
SELECT ServerNumber::TEXT, ServerNumber AS lvl
FROM SAPInstanceNumbers AS t1
CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber) AS t2
ORDER BY lvl

Działa ale dalej mam duplikaty czyli 2 razy tab local definition.

sprobowałem z select distinct ServerNumber FROM ale dostaje blad w postgresie:

SQL Error [42P10]: BŁĄD: dla SELECT DISTINCT, ORDER BY wyrażenia muszą występować na liście wyboru.

Jak temu zaradzić?
Jacek

0

Dodaj grupowanie po ServerNumber

0

CROSS JOIN generate_series(t1.MinNumber, t1.MaxNumber) as ServerNumber) AS t2
GROUP BY serverNumber
ORDER BY lvl

Dalej to samo, gdzie to dodać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1