abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 20:22 | Komunita

    FreeBSD odstranilo poslední GPL kód ze základního systému. Konkrétně dpv, libdpv, libfigpar a dialog. Instalátor před čtyřmi lety přešel z dialogu na bsddialog.

    Ladislav Hagara | Komentářů: 0
    dnes 15:22 | IT novinky

    Sociální síti 𝕏 (dříve Twitter) má dnes 20 let. Pro veřejnost byla zpřístupněna 15. července 2006.

    Ladislav Hagara | Komentářů: 1
    dnes 14:22 | Zajímavý software

    Insula Faktury je open source generátor faktur, který běží přímo ve webovém prohlížeči. Žádná registrace, žádné sledování, žádné omezení. Zdrojové kódy jsou k dispozici na Codebergu.

    Ladislav Hagara | Komentářů: 5
    dnes 13:22 | Komunita

    První Mobile Linux Hackday v Plzni, tj. komunitní setkání věnované Linuxu na mobilních zařízeních, proběhne 24. července od 10:00. Akce je otevřená všem zájemcům – od zvědavců po zkušené vývojáře. Dopoledne proběhnou přednášky Davida Heidelberga a Petra Hodiny o aktuálním stavu mobilního Linuxu: proč vůbec chtít tučňáka v kapse, jaké telefony jsou dnes dobře podporované a co taková podpora obnáší. Po obědě se zaměříme na konkrétní

    … více »
    Ladislav Hagara | Komentářů: 0
    včera 19:33 | Nová verze

    3D software Blender byl vydán ve verzi 5.2 s prodlouženou podporou. Videopředstavení na YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 16:55 | Zajímavý software

    SketchForge 3D (GitHub, reddit) je open source 3D editor / CAD běžící ve webovém prohlížeči bez nutnosti účtu nebo cloudového úložiště. Inspirovaný byl Tinkercadem. Doporučena je lokální instalace.

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

    Byla vydána nová verze 11.9 webového prohlížeče Midori (Wikipedie, GitHub). S novým centrem ovládání, pokročilejším blokováním reklam, optimalizací výkonu…

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Zajímavý projekt

    Na Crowd Supply běží kampaň na podporu open source čtečky elektronických knih Open Book Touch. Postavena je na ESP32-S3. Má 4,26palcový dotykový e-papírový displej s rozlišením 480×800 pixelů, podsvícení, slot na microSD kartu. Cena je 149 dolarů a poštovné 12 dolarů. Dodání je plánováno na duben 2027.

    Ladislav Hagara | Komentářů: 8
    13.7. 18:00 | IT novinky

    Na Humble Bundle běží akce Linux: All the Things by O'Reilly a Picos, HATs, and More by Raspberry Pi Press. Elektronické knihy lze koupit se slevou a současně podpořit organizace Code for America a Raspberry Pi Foundation.

    Ladislav Hagara | Komentářů: 5
    13.7. 14:00 | Komunita

    FreeCAD (Wikipedie), tj. svobodný multiplatformní parametrický 3D CAD, má nový vtipný a současně užitečný doplněk Banana For Scale (GitHub). Aktuálně umožňuje do výkresu vložit banán nebo plechovku pro porovnání a určení měřítka.

    Ladislav Hagara | Komentářů: 4
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (17%)
     (31%)
     (4%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 2131 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: RDBMS - jsou vygenerované dotazy ekvivalentní?

    4.11.2010 00:02 rdbms
    RDBMS - jsou vygenerované dotazy ekvivalentní?
    Přečteno: 584×
    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.