NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Výber najvyššieho možného čísla z tabuľky

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Miroslav Holubek:11.10.2017 15:23

Ahojte,

potreboval by som pomôcť s jedným výberom,
mám tabuľku, kde ukladám záznamy,
záznamy majú rôzne typy (A, W, D, F...), všetky majú svoje poradové čísla
A1, A2, A3..
W1, W2, W3...
každý záznam je teda o jedno číslo väčší ako pôvodný,

potom existuje druhá tabuľka, kde sú spoločnosti, každá má svoje ID

a ešte tabuľka, kde sú rezervácie na čísla (Plant_ID, Profile_Type, NO_FROM, NO_TO),

to znamená, že keď je vytváram záznam pre spoločnosť A ktorý je v tabuľke na rezerváciu dostane číslo z danej rezervácie,
a spoločnosť B ktorá nieje v rezervácii dostane najvyššie možné číslo mimo čísiel ktoré sú rezervované,

Pracujem v VB.NET a chcel by som to všetko v jednom Query, teda mimo podmienkovania vo VB

if not Exists (select * from DRAWING_NO_RESERVATIONS where PLANT_ID = 1 and profile_type = 'A')
begin
        select drawing_no from drawings1
        where drawing_type = 'A' and
        (drawing_no + 1 not between (select NO_FROM from DRAWING_NO_RESERVATIONS where profile_type = 'A') and (select NO_TO from DRAWING_NO_RESERVATIONS where profile_type = 'A') )
        order by drawing_no desc
End
Else
begin
        select drawing_no from drawings1
        where drawing_type = 'A' and
        (drawing_no + 1  between (select NO_FROM from DRAWING_NO_RESERVATIONS where plant_id = 1 and profile_type = 'A') and (select NO_TO from DRAWING_NO_RESERVATIONS where plant_id = 1 and profile_type = 'A') )
        order by drawing_no desc
End

v priloženom kóde by teoreticky mala fungovať druhá časť, ale prvá mi dá chybu

Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

ak niekto pochopil čo vlastne potrebujem a dokope ma k výsledku budem veľmi štastný :-)

 
Odpovědět
11.10.2017 15:23
Avatar
Odpovídá na Miroslav Holubek
Michal Štěpánek:11.10.2017 18:32

Z té chyby je to patrné - Poddotaz vrací více než jednu hodnotu.
asi bych nevolil "not between", ale "NOT IN", nicméně není mi z toho tvého dotazu zcela jasné, čeho chceš dosáhnout.
Mimochodem snažit se nacpat vše do jednoho dotazu nemusí být vždy ideální řešení...

Nahoru Odpovědět
11.10.2017 18:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Miroslav Holubek:11.10.2017 20:35

problému rozumiem, len ho neviem vyriešiť :)
hneď ráno skúsim not in a skúsim to aj vysvetliť :)

 
Nahoru Odpovědět
11.10.2017 20:35
Avatar
plelovsky
Člen
Avatar
plelovsky:13.10.2017 9:42

Aniž bych se snažil pochopit co řešíš - v těch subquery můžeš použít MAX(), MIN() - pak to vrátí jednu hodnotu.

 
Nahoru Odpovědět
13.10.2017 9:42
Avatar
Odpovídá na plelovsky
Miroslav Holubek:16.10.2017 16:00

v podstate v tabuľke kde sú rezervácie mám stĺpce

[ID] [int] IDENTITY(1,1) NOT NULL,
[PLANT_ID] [int] NULL,
[PROFILE_TYPE] [nvarchar](50) NULL,
[NO_FROM] [int] NULL,
[NO_TO] [int] NULL

Plant_id obsahuje ID spolocnosti ktore je z tabulky spolocnosti,
Profile_type obsahuje typ profilu, zatial vzdy 'A'
No_from je zaciatok rezervacie
No_to je koniec rezervacie

ked ma spolocnost rezervaciu nemam problem vygenerovat cislo,
ale ked spolocnost nema rezervaciu potrebujem generovat vzdy najnizsie mozne cislo, ale nesmie byt v rezervacii,
uz som to nejako dal dokopy, ale stale to nieje ono
potrebujem sa pozriet do tabulky rezervacii a zistit ci vygenerovane cislo nieje v ktorom kolvek rozsahu

dufam ze som to vysvetlil dobre :-)

 
Nahoru Odpovědět
16.10.2017 16:00
Avatar
Odpovídá na Miroslav Holubek
Michal Štěpánek:16.10.2017 16:11

Pořád nějak nechápu, jaké číslo to vlastně chceš generovat?

Nahoru Odpovědět
16.10.2017 16:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
plelovsky
Člen
Avatar
plelovsky:16.10.2017 17:06

a spoločnosť B ktorá nieje v rezervácii dostane najvyššie možné číslo mimo čísiel ktoré sú rezervované,

ale ked spolocnost nema rezervaciu potrebujem generovat vzdy najnizsie mozne cislo, ale nesmie byt v rezervacii,

Mezi pojmy nejvyšší a nejnižší je jistý jemný rozdíl. Následující script je pro nejvyšší číslo:

-- vybere minimum ze dvou cisel ve vysledku subquery
SELECT
        drawing_no = MIN(drawing_no)
FROM (
        -- vybere nejnizsi cislo, ktere je v nejake rezervaci
        -- nebo nic, pokud neexistuje rezervace
        SELECT
                drawing_no = MIN(drawing_no)
        FROM
                drawings1 AS d
                INNER JOIN drawing_no_reservations AS r ON
                        r.profile_type = 'A'
                        AND
                        r.plant_id = 1
                        AND
                        d.drawing_no + 1 BETWEEN r.no_from AND r.no_to
        WHERE
                d.drawing_type = 'A'

        UNION ALL

        -- vybere nejvyssi cislo, ktere neni v zadne rezervaci
        SELECT
                drawing_no = MAX(drawing_no)
        FROM
                drawings1 AS d
                LEFT OUTER JOIN drawing_no_reservations AS r ON
                        r.profile_type = 'A'
                        AND
                        d.drawing_no + 1 BETWEEN r.no_from AND r.no_to
        WHERE
                d.drawing_type = 'A'
                AND
                r.ID IS NULL
) AS q

Zřejmě špatně chápeš operátor BETWEEN. Ten testuje, jestli nějaká hodnota je v rozsahu daném počáteční a koncovou hodnotou. Např.
2 BETWEEN 1 AND 3 = true
4 BETWEEN 1 AND 3 = false

 
Nahoru Odpovědět
16.10.2017 17:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.