Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Mysql dotaz složitější - jde to ?

Zdar, mám tu jednu takovou složitost. Chtěl bych poskládat dotaz takto: vybere z tabulky a všechyn sloupce místo toho aby vrátil číslo (v jednom sloupci, v druhém mám druhy jeden sloupeček id druhy názvy) by vrátil název toho druhu. Jde to, nebo se to musí dělat na několikrát ? Díky za pomoc.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Pro inspiraci jeden z mých běžných dotazů (plně funkční!): SELECT NI.CisloRozhodnuti, NI.IDosoba, M…
Rce 14.09.2010 23:09
Rce
zaujimave, ale obavam sa, ze ak by v tom chcel niekto iny (mimo teba) urobit upravu ci zmenu, tak ne…
wam_Spider007 14.09.2010 23:40
wam_Spider007
Není tady prostor abych zde rozpitvával zadání. Spojení tabulek je pak celkem logické a ty vložené s… nový
Rce 15.09.2010 00:17
Rce
Výsledok zlého návrhu databázy... nový
los 15.09.2010 00:28
los
Ani taky ne. Ne vždy jde navrhnout databáze "na všechno". Návrh databáze jsem nedělal já. Je to z in… poslední
Rce 15.09.2010 01:42
Rce

Pro inspiraci jeden z mých běžných dotazů (plně funkční!):

SELECT NI.CisloRozhodnuti, NI.IDosoba, MIN(NI.Podil) AS Podil, MIN(NI.UPcislo) AS UPcislo, 
      SUM(ISNULL(Z1.Kc, 0) + ISNULL(Z2.Kc, 0) + ISNULL(Z3.Kc, 0) + ISNULL(Z4.Kc, 0) + ISNULL(Z5.Kc, 0) + ISNULL(Z6.Kc, 0) - isnull (Z7.Kc, 0)) AS Celkem
    FROM    (
            SELECT min (N.Par) as Par, N.CisloRozhodnuti, I.IDosoba, SUM(I.Pomer1 * N.Hodnota / I.Pomer2) AS Podil, MIN(N .UPcislo) AS UPcislo 
                    FROM NarPozemky_N N INNER JOIN IDOOPOZ I ON N.CisloRozhodnuti = I.CisloRozhodnuti AND N.CisloPozemku = I.CisloPozemku AND N .UPcislo = I.UPcislo
                    WHERE ' + PutUpCislo ('N', true) + ' AND (N .Par = ' + IntToStr (SrPar) + ') AND (I.Pomer2 <> 0) 
                    GROUP BY N.CisloRozhodnuti, I.IDosoba
            ) NI
    LEFT OUTER JOIN
        (SELECT IDOsoba, CisloRozhodnuti, UPcislo, Par, SUM(Kc) AS Kc FROM Blok11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo, Par) Z1
            ON NI.CisloRozhodnuti = Z1.CisloRozhodnuti AND NI.IDosoba = Z1.IDOsoba AND NI.UPcislo = Z1.UPcislo and NI.Par = Z1.Par
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, Par, SUM(Kc) AS Kc FROM LesyZdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo, Par) Z2
            ON NI.CisloRozhodnuti = Z2.CisloRozhodnuti AND NI.IDosoba = Z2.IDOsoba AND NI.UPcislo = Z2.UPcislo and NI.Par = Z2.Par
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, Par, SUM(Kc) AS Kc FROM MZEZdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo, Par) Z3
            ON NI.CisloRozhodnuti = Z3.CisloRozhodnuti AND NI.IDosoba = Z3.IDOsoba AND NI.UPcislo = Z3.UPcislo and NI.Par = Z3.Par
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, SUM(Kc) AS Kc FROM Vec11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo) Z4
            ON NI.CisloRozhodnuti = Z4.CisloRozhodnuti AND NI.IDosoba = Z4.IDOsoba AND NI.UPcislo = Z4.UPcislo
            LEFT OUTER JOIN
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, SUM(Kc) AS Kc FROM Zap11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo) Z5
            ON NI.CisloRozhodnuti = Z5.CisloRozhodnuti AND NI.IDosoba = Z5.IDosoba AND NI.UPcislo = Z5.UPcislo 
            LEFT OUTER JOIN 
                (SELECT IDOsoba, CisloRozhodnuti, UPcislo, SUM(Kc) AS Kc FROM ChybPln11Zdroj GROUP BY IDOsoba, CisloRozhodnuti, UPcislo) Z6
            ON NI.CisloRozhodnuti = Z6.CisloRozhodnuti AND NI.IDosoba = Z6.IDOsoba AND NI.UPcislo = Z6.UPcislo
            left outer join
                (SELECT MIN(PZ.UPcislo) AS UPcislo, A.IDOsoba, PZ.CisloRozhodnuti, SUM(PZ.Kc) AS Kc
                    FROM   Post11Zdroj PZ
                    INNER JOIN Post11  P ON PZ.UPcislo = P.UPcislo AND PZ.IDPrevod = P.IDPrevod AND PZ.IDosoba = P.IDosoba
                        INNER JOIN ADRESAR A ON PZ.UPcislo = A.UPcislo AND P.KlientID_Prev = A.KlientID
                    GROUP BY A.IDOsoba, PZ.CisloRozhodnuti) Z7
            on NI.CisloRozhodnuti = Z7.CisloRozhodnuti AND NI.IDosoba = Z7.IDOsoba AND NI.UPcislo = Z7.UPcislo
                         'GROUP BY NI.CisloRozhodnuti, NI.IDosoba
    HAVING (SUM(ISNULL(Z1.Kc, 0) + ISNULL(Z2.Kc, 0) + ISNULL(Z3.Kc, 0) + ISNULL(Z4.Kc, 0) + ISNULL(Z5.Kc, 0) + ISNULL(Z6.Kc, 0) - isnull (Z7.Kc, 0)) > MIN(NI.Podil) + 0.99) 

zaujimave, ale obavam sa, ze ak by v tom chcel niekto iny (mimo teba) urobit upravu ci zmenu, tak nema sancu a skorej napise novy select.
kebyze po niekom najdem v praci takyto kod, tak mu odrapim ruky. je to dost neprehladne (hlavne kvoli tym substituciam pomocou selectov) a zbytocne sa tam pouziva OUTER. verim, ze pouzitim funkcii, view (a pokial je to MS SQL tak aj with) by sa tento select zmestil na par riadkov.

Není tady prostor abych zde rozpitvával zadání. Spojení tabulek je pak celkem logické a ty vložené selecty IMHO to naopak zjednodušují pro jiného, protože je přesně na místě ucelený select. Je to názornější, než dělat nejprve pomocné přechodné tabulky. Původně to bylo určeno pro MS SQL, cílem byla tisková sestav v Delphi. Samozřejmě, není to jediné možné řešení a věřím, že co programátor, to jiné neméně dobré řešení.

Ani taky ne. Ne vždy jde navrhnout databáze "na všechno". Návrh databáze jsem nedělal já. Je to z inventury nároků na restituci, kde bylo strašlivě moc variant - měl pole, dali za to barák + peníze nebo les, nemovitosti, prostě kvanta možností a jejich kombinace. Tento obří select vyhledával chyby v databázi tedy nepovolené kombinace nároků a plnění restitucí. Vnitřní selecty vytahují chybné věty a "obalový" select to vhodně seřadí a vysoučtuje.

Zpět do poradny Odpovědět na původní otázku Nahoru