Autor Zpráva
Andrej.B
Profil
Zdravim,

vyberam z tabulky zaznamy o case vyroby.

mam tam 3 rozne zaznamy

1Riadok | Polozka | Verzia | Popis | Hodiny
2 
31 | TR18403 | 1 | stroj 1 | 1,233
42 | TR18403 | 1 | stroj 2 | 1,111
53 | TR18403 | 2 | stroj 1 | 1,111
Riadok | Polozka | Verzia | Popis | Hodiny
 
1 | TR18403 | 1 | stroj 1 | 1,233
2 | TR18403 | 1 | stroj 2 | 1,111
3 | TR18403 | 2 | stroj 1 | 1,111


Potrebujem vybrat vsetky polozky

where polozka = 'TR18403'
AND 'kde je Verzia navyssie cislo z daneho stroja'

Malo by to vybrat riadok 2 a 3, pretoze stroj 1 ma najvyssiu verziu 2 a to je riadok 3, a stroj 2 ma jedinu a to najvyssiu 1

Ako docielit toho aby to tak vybralo?
Alebo nejako updatovat celu tabulku v DB, kde by som si priradil k takym zaznamom dalsi column Aktivny s priznakom ano/nie napriklad?

Dakujem
Kajman
Profil
Něco jako
1SELECT z.*
2FROM   zaznamy z
3       JOIN (SELECT polozka,
4                    popis,
5                    Max(verzia) max_verzia
6             FROM   zaznamy zg
7             WHERE  zg.polozka = 'TR18403'
8             GROUP  BY zg.polozka, zg.popis
9             ) zm
10         ON z.polozka = zm.polozka
11            AND z.popis = zm.popis
12            AND z.verzia = zm.max_verzia  
SELECT z.*
FROM   zaznamy z
       JOIN (SELECT polozka,
                    popis,
                    Max(verzia) max_verzia
             FROM   zaznamy zg
             WHERE  zg.polozka = 'TR18403'
             GROUP  BY zg.polozka, zg.popis
             ) zm
         ON z.polozka = zm.polozka
            AND z.popis = zm.popis
            AND z.verzia = zm.max_verzia  
Andrej.B
Profil
Kajman:

funguje ako ma.

Ja som medzitym urobil nieco, co tiez funguje, ale niesom si isty, ci to nemoze spravit nejaky specificky problem neskor pri nejakom produkte.
Zatial som si dal testovacej verzie vas aj moj a uvidim, ci sa pri testovani nieco neobjavi.

1SELECT *
2FROM zaznamy
3WHERE polozka = 'TR18403' 
4AND verzia IN 
5(
6Select max(verzia) 
7from zaznamy 
8WHERE polozka  = 'TR18403' 
9)
SELECT *
FROM zaznamy
WHERE polozka = 'TR18403' 
AND verzia IN 
(
Select max(verzia) 
from zaznamy 
WHERE polozka  = 'TR18403' 
)

Je este najaka moznost upravit Vas ci moj na update celej tabulky pre otazku 2?

Andrej.B:
Alebo nejako updatovat celu tabulku v DB, kde by som si priradil k takym zaznamom dalsi column Aktivny s priznakom ano/nie napriklad?

Dakujem
anonym_
Profil *
Andrej.B:
Ten tvůj dotaz přeci vrátí jen jeden záznam, ne? Nikde tam nepracujes s jednlitvymi stroji.
Keeehi
Profil
anonym:
Stejný problém má i ten dotaz od Kajman. Ale je to lehce řešitelné, stačí na konec toho subselectu přidat GROUP BY polozka, popis

Andrej.B:
Při jedné položce fungují dotazy stejně. Ten od Kajman je však lehce rozšiřitelný na více položek. Stačí dát WHERE zg.polozka IN ('TR18403', 'PU12765'), nebo tu podmínku celou odstranit. V takovém případě to najde ty poslední verze pro veškeré položky a stroje.
Kajman
Profil
Doplnil jsem chybějící group by do poddotazu.

Update bude asi podobný, zkuste ho na testovacích datech

1UPDATE zaznamy z
2       JOIN (SELECT polozka,
3                    popis,
4                    Max(verzia) max_verzia
5             FROM   zaznamy zg
6             /* WHERE  zg.polozka = 'TR18403' */
7             GROUP  BY zg.polozka, zg.popis
8             ) zm
9         ON z.polozka = zm.polozka
10            AND z.popis = zm.popis
11SET z.aktivni = (z.verzia = zm.max_verzia)
UPDATE zaznamy z
       JOIN (SELECT polozka,
                    popis,
                    Max(verzia) max_verzia
             FROM   zaznamy zg
             /* WHERE  zg.polozka = 'TR18403' */
             GROUP  BY zg.polozka, zg.popis
             ) zm
         ON z.polozka = zm.polozka
            AND z.popis = zm.popis
SET z.aktivni = (z.verzia = zm.max_verzia)
Andrej.B
Profil
anonym:

dotaz vracia vsetky stroje, ktore maju podmienku Where = Polozka a navyssie cislo. Ukazuje ako ma.

Kajman:

done. Perfekt. Teraz mi staci pouzit jednoduchsi select na kontrolu, ktory cas je platny ku ktoremu stroju a polozke.

Dakujem vsetkym
Kajman
Profil
Andrej.B:
Ukazuje ako ma

Kdepak. Nehledáte max pro každý stroj, proto to nebude fungovat dobře. Pokud tedy jako v příkladu nemají všechny stroje stejnou maxímální verzi, nebudou všechny vypsány. Nad daty z [#1] to tedy vypíše jen stroj 1 ale ne stroj 2.
Andrej.B
Profil
Kajman:
Kdepak. Nehledáte max pro každý stroj, proto to nebude fungovat dobře. Pokud tedy jako v příkladu nemají všechny stroje stejnou maxímální verzi, nebudou všechny vypsány. Nad daty z [#1] to tedy vypíše jen stroj 1 ale ne stroj 2.


Zdravim,

tak toto je dost mimo mna uz.


DATA:

1riadok    polozka    verzia    popis    hodiny
21    TR18021/090/07    1    23002 - TEVAP    0,001714
32    TR18021/090/07    1    23002 - TEVAP    0,001714
43    TR18021/090/07    1    23007 - MASTR    0,0025
54    TR18021/090/07    1    23010 - SWAH 2    0,002055
65    TR18021/090/07    1    23007 - MASTR    0,0025
76    TR18021/090/07    2    23002 - TEVAP    0,001714
87    TR18021/090/07    2    23007 - MASTR    0,002242
98    TR18021/090/07    2    23010 - SWAH 2    0,001463
109    TR18021/090/07    3    23002 - TEVAP    0,001714
1110    TR18021/090/07    3    23007 - MASTR    0,00203
1211    TR18021/090/07    3    23010 - SWAH 2    0,001463
1312    TR18021/090/07    3    23011 - SWAH 3    0,001694
riadok    polozka    verzia    popis    hodiny
1    TR18021/090/07    1    23002 - TEVAP    0,001714
2    TR18021/090/07    1    23002 - TEVAP    0,001714
3    TR18021/090/07    1    23007 - MASTR    0,0025
4    TR18021/090/07    1    23010 - SWAH 2    0,002055
5    TR18021/090/07    1    23007 - MASTR    0,0025
6    TR18021/090/07    2    23002 - TEVAP    0,001714
7    TR18021/090/07    2    23007 - MASTR    0,002242
8    TR18021/090/07    2    23010 - SWAH 2    0,001463
9    TR18021/090/07    3    23002 - TEVAP    0,001714
10    TR18021/090/07    3    23007 - MASTR    0,00203
11    TR18021/090/07    3    23010 - SWAH 2    0,001463
12    TR18021/090/07    3    23011 - SWAH 3    0,001694

Pokial zadam tento kod do Adminera, ci normalne v mojom kode cez While, kde si vypisujem stroje, tak vsetko funguje a vyhodi mi to, co ma. 4 riadky.



1SELECT *
2FROM zaznamy
3WHERE polozka = 'TR18021/090/07' 
4AND verzia IN 
5(
6Select max(verzia) 
7from zaznamy 
8WHERE polozka  = 'TR18021/090/07' 
9)
SELECT *
FROM zaznamy
WHERE polozka = 'TR18021/090/07' 
AND verzia IN 
(
Select max(verzia) 
from zaznamy 
WHERE polozka  = 'TR18021/090/07' 
)

Hodil som to vsetko teda do SQL fiddle, ze vam ukazem ako presne to mam u seba a tam uz je ten riadok len jeden.

sqlfiddle.com/#!9/13a0ac/2

Je to nejakym nastavenim servera, ci ako?

Inak ten vas z [#2] Kajman funguje ako vidno na Fiddle - sqlfiddle.com/#!9/13a0ac/1
anonym_
Profil *
Andrej.B:
Tobě to najde 4 záznamy, protože tam je čtyřikrát verze (čehokoliv) 3. Kajmanovi to najde také 4 záznamy, ale jiné, než tobě (ty správné).
Kajman
Profil
Pokud máte doma 12 řádků, co jste poslal sem v [#9] a na sqlfiddle 13 řádků, tak není divné, že dotaz vypíše jiné řádky pro jiné databáze. U těch třinácti se ukáže chyba ve Vašem dotaze z [#3].
Andrej.B
Profil
Dakujem vsetkym. Uz mi to doslo.
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.

Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:


Běda vám, jestli to bude blábol.

0