abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 17:11 | Nová verze

    Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.

    Ladislav Hagara | Komentářů: 0
    dnes 13:33 | Nová verze

    Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.

    Pavel Křivánek | Komentářů: 3
    dnes 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 30
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 13
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 2
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (73%)
     (9%)
     (2%)
     (16%)
    Celkem 796 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: RDBMS - jsou vygenerované dotazy ekvivalentní?

    4.11.2010 00:02 rdbms
    RDBMS - jsou vygenerované dotazy ekvivalentní?
    Přečteno: 464×
    Zdravím místní guru. Musel jsem si napsat jednoduchou php aplikaci na generování dotazů pro různé sql databázové stroje. Po několikahodinovém studování manuálů jsem to napsal. Odzkoušel jsem to v MySQL a Oracle, ale nemám k dispozici ostatní databáze. Mohl by prosím někdo zasvěcený kouknout na následující dotazy a zkontrolovat jestli jsou zápisy pro SELECT ekvivalentní a hlavně funkční? (ibm = DB2, dblib = MSSQL, oci = ORACLE)
    ///// mysql \\\\\
    SELECT `UZIVATELE`.`CISLO` AS `CISLO`,`UZIVATELE`.`JMENO` AS `JMENO`,`SKUPINY`.`JMENO` AS `SKUPINY_JMENO` FROM `UZIVATELE` LEFT JOIN `SKUPINY` ON `UZIVATELE`.`CISLO` = `SKUPINY`.`CISLO` WHERE (`UZIVATELE`.`CISLO`>4 AND `UZIVATELE`.`JMENO`<>'PEPA' AND `UZIVATELE`.`JMENO`<>'JOSEF') ORDER BY `UZIVATELE`.`CISLO` LIMIT 4 OFFSET 1
    
    ///// pgsql \\\\\
    SELECT "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO" FROM "UZIVATELE" LEFT JOIN "SKUPINY" ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF') ORDER BY "UZIVATELE"."CISLO" LIMIT 4 OFFSET 1
    
    ///// firebird \\\\\
    SELECT "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO" FROM "UZIVATELE" LEFT JOIN "SKUPINY" ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF') ORDER BY "UZIVATELE"."CISLO" ROWS 2 TO 5
    
    ///// oci \\\\\
    SELECT "CISLO","JMENO","SKUPINY_JMENO" FROM (SELECT "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO",ROW_NUMBER() OVER (ORDER BY "UZIVATELE"."CISLO") AS RN FROM "UZIVATELE" LEFT JOIN "SKUPINY" ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF')) WHERE RN <= 5 AND RN > 1
    
    ///// ibm \\\\\
    SELECT "CISLO","JMENO","SKUPINY_JMENO" FROM (SELECT "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO",ROW_NUMBER() OVER (ORDER BY "UZIVATELE"."CISLO") AS RN FROM "UZIVATELE" LEFT JOIN "SKUPINY" ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF')) WHERE RN <= 5 AND RN > 1
    
    ///// dblib \\\\\
    SELECT "CISLO","JMENO","SKUPINY_JMENO" FROM (SELECT "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO",ROW_NUMBER() OVER (ORDER BY "UZIVATELE"."CISLO") AS RN FROM "UZIVATELE" LEFT JOIN "SKUPINY" ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF')) WHERE RN <= 5 AND RN > 1
    
    ///// sqlite \\\\\
    SELECT "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO" FROM "UZIVATELE" LEFT JOIN "SKUPINY" ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF') ORDER BY "UZIVATELE"."CISLO" LIMIT 4 OFFSET 1
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    ///// mysql \\\\\
    SELECT `CISLO` AS `CISLO`,COUNT(`JMENO`) AS `JMENO` FROM `UZIVATELE` WHERE (`CISLO`>4) GROUP BY `CISLO` ORDER BY `CISLO` LIMIT 4 OFFSET 1
    
    ///// pgsql \\\\\
    SELECT "CISLO" AS "CISLO",COUNT("JMENO") AS "JMENO" FROM "UZIVATELE" WHERE ("CISLO">4) GROUP BY "CISLO" ORDER BY "CISLO" LIMIT 4 OFFSET 1
    
    ///// firebird \\\\\
    SELECT "CISLO" AS "CISLO",COUNT("JMENO") AS "JMENO" FROM "UZIVATELE" WHERE ("CISLO">4) GROUP BY "CISLO" ORDER BY "CISLO" ROWS 2 TO 5
    
    ///// oci \\\\\
    SELECT "CISLO","JMENO" FROM (SELECT "CISLO" AS "CISLO",COUNT("JMENO") AS "JMENO",ROW_NUMBER() OVER (ORDER BY "CISLO") AS RN FROM "UZIVATELE" WHERE ("CISLO">4) GROUP BY "CISLO") WHERE RN <= 5 AND RN > 1
    
    ///// ibm \\\\\
    SELECT "CISLO","JMENO" FROM (SELECT "CISLO" AS "CISLO",COUNT("JMENO") AS "JMENO",ROW_NUMBER() OVER (ORDER BY "CISLO") AS RN FROM "UZIVATELE" WHERE ("CISLO">4) GROUP BY "CISLO") WHERE RN <= 5 AND RN > 1
    
    ///// dblib \\\\\
    SELECT "CISLO","JMENO" FROM (SELECT "CISLO" AS "CISLO",COUNT("JMENO") AS "JMENO",ROW_NUMBER() OVER (ORDER BY "CISLO") AS RN FROM "UZIVATELE" WHERE ("CISLO">4) GROUP BY "CISLO") WHERE RN <= 5 AND RN > 1
    
    ///// sqlite \\\\\
    SELECT "CISLO" AS "CISLO",COUNT("JMENO") AS "JMENO" FROM "UZIVATELE" WHERE ("CISLO">4) GROUP BY "CISLO" ORDER BY "CISLO" LIMIT 4 OFFSET 1
    
    Ještě bych potřeboval vědět jak se tyto databáze perou s velkými/malými písmeny. V Oraclu jsem musel názvy sloupců převést do velkých písem protože s tím měl problémy, mysql zvládá malá i velká. Jak jsou na tom ostatní. Předem děkuji za reakce.

    Odpovědi

    4.11.2010 07:30 jeleniste | skóre: 13 | blog: Prokustovo lože
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?

    K MSSQL, ekvivalent k limit o MSSQL je

    Select top 5 * from tbl

    Nicméně to tam nedostaneš ten offset, tohle ti bude fungovat, ale já bych to zapsal:

    WITH CTE AS
    (
    Select
    *, row_number() over(order by neco) pid
    from tbl1
    join neco on...
    )
    Select tohle a tamto from CTE where pid between 1 and 4

    přičemž to cte není nezbytný, ale proč ho nepoužít, když je k dispozici (někdo to možná označí za syntaktickou prasárnu)

    ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF'))

    bych napsal jako: ON "UZIVATELE"."CISLO" = "SKUPINY"."CISLO"
    and UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA'
    AND "UZIVATELE"."JMENO"<>'JOSEF'

    Nejsem blbý, jen se hloupě ptám
    4.11.2010 10:21 rdbms
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    Podle dokumentací by měl zápis pro DB2, MSSQL a ORACLE v tomto případě být shodný. Jestli jsem to pochopil tak ten můj zápis bude pro mssql fungovat? Jestli ano tak to mi víceméně stačí protože je to sql standard. Ten zápis s where mi ulehčí v programu několik desítek řádků kódu a budou se v tom lépe hledat chyby - pokud to chápu tak zápis s where se aplikuje po spojení tabulek, ale ten druhý zápis je rovnou omezení při spojování tabulek (...možná si to db optimalizuje?).
    4.11.2010 14:45 jeleniste | skóre: 13 | blog: Prokustovo lože
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?

    Nebude to fungovat

    Protože vnořený Select musí mít alias

    SELECT 
      "CISLO","JMENO","SKUPINY_JMENO" 
     FROM 
      (
        SELECT 
          "UZIVATELE"."CISLO" AS "CISLO","UZIVATELE"."JMENO" AS "JMENO","SKUPINY"."JMENO" AS "SKUPINY_JMENO"
          ,ROW_NUMBER() OVER (ORDER BY "UZIVATELE"."CISLO") AS RN 
         FROM 
         "UZIVATELE" 
          LEFT JOIN 
         "SKUPINY" 
         ON 
           "UZIVATELE"."CISLO" = "SKUPINY"."CISLO" 
         WHERE 
          ( 
            "UZIVATELE"."CISLO">4 
        AND "UZIVATELE"."JMENO"<>'PEPA' 
        AND "UZIVATELE"."JMENO"<>'JOSEF'
           )
       ) dta
    WHERE RN <= 5 AND RN > 1 

    tohle bude fungovat, nevim, esli to bude vracet to, co to vracet má (protože nevim, co to vracet má), ale fungovat to bude

    Nejsem blbý, jen se hloupě ptám
    4.11.2010 17:57 rdbms
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    Děkuju. Tady je úplně jedno co to bude vracet, ale musí to vracet stejné hodnoty pod všemi RDBMS. S tím aliasem to funguje i pod Oracle takže to je ok. Ještě bych potřeboval aby mi někdo napsal, zda jsou syntakticky v pořádku dotazy i pro ostatní databáze (i s přihlédnutím na limitování výstupních hodnot - jde o to, že mysql má offset od 0, firebird má rows od 1 apod.).
    4.11.2010 19:03 jekub
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    musí to vracet stejné hodnoty pod všemi RDBMS

    bez šance. zkuste nějaký update bez dokončení transakce a v jiném spojení select z opravovaných dat. někde select skončí chybou (mssql - tady ale myslím záleží na stránkování datového souboru), někde bude čekat ma dokončení (db2, informix) a oracle prostě vrátí hodnoty platné (konzistentní čtení) dokud nebude transakce opravující data potvrzena.
    4.11.2010 20:02 rdbms
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    Dobrá tedy: pokud nepředpokládám nějakou předchozí modifikaci nebo použití transakce tak to musí vrátit stejná data.
    5.11.2010 08:53 jeleniste | skóre: 13 | blog: Prokustovo lože
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    No, ono tomu tak nutně nemusí bejt, protože jinak IMHO funguje row_number + podmínka a jinak limit. Jednak je třeba ošetřit collation u toho order by (pokud to nebudou jen čísla, ale i nějaký to písmenko) a potom by se ti mohlo stát, že výsledek nebude totožnej, pokud budeš mít v tom podle čeho je to řazené dvě stejné hodnoty.
    Nejsem blbý, jen se hloupě ptám
    5.11.2010 11:03 s0 | skóre: 32 | blog: nejchytřejší kecy | prágl
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    ad oracle a velikost písmen v identifikátorech:

    jde to. Porovnej:

    select 1 from dual;
    select 1 from "dual";
    select 1 from "DUAL";
    

    jde o ty uvozovky kolem.

    jinak už mám jen takovou poznámku. K oraclu samozřejmě:

    ... WHERE ("UZIVATELE"."CISLO">4 AND "UZIVATELE"."JMENO"<>'PEPA' AND "UZIVATELE"."JMENO"<>'JOSEF')) WHERE RN <= 5 AND RN > 1

    máš nějaký konkrétní důvod, proč používáš v podmínkách hodnoty místo bindovaných proměnných? Pár důvodů existuje, ale jsem si téměř jistý, že to není tvůj případ.
    Kuolema Kaikille (Paitsi Meille).
    5.11.2010 15:51 rdbms
    Rozbalit Rozbalit vše Re: RDBMS - jsou vygenerované dotazy ekvivalentní?
    máš nějaký konkrétní důvod, proč používáš v podmínkách hodnoty místo bindovaných proměnných? Pár důvodů existuje, ale jsem si téměř jistý, že to není tvůj případ.
    Důvod nemám. Dřív než jsem předělal aplikaci aby striktně používala pro všechny sloupce "AS", což jak jsem zjistil u vnořeých dotazů je nutnost, jsem měl where napsaný tahle a už jsem where část dotazu nepředělal.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.