Výsledky 1 až 8 z 8

Téma: komplikovanty SQL dotaz

  1. #1

    Standardní komplikovanty SQL dotaz

    Zdravim, sorry za zalozeni noveho tematu, ale zadny prihodny jsem nenasel. Ucim se pracovat s SQL v moji nove praci a problem je nasledujici. Mame nejakou databazi aut, vpodstate to je komplet databaze vsech aut co se prodavaji nebo prodavaly v jedne tabulce, takze si umite predstavit, jak je asi velka. Mimo jine tam je osm kolonek s jednotlivimy nazvy konkretniho modelu, tedy napr. v jednom sloupci je AUDI, v dalsim A4, dale AVANT a podobne. Dale tam je sloupec kde je totez oddelenem mezerami (ano, nesplnuje prvni normalizacni podminku). Mojim ukolem je najit v tabulce auta, ktera maji stejny nazev, ale jehoz sekvence je nejak prohozena, tedy napr. AUDI AVANT A4 a AUDI A4 AVANT. Zni to jako jednoduchy ukol, ale problem je, ze to musi dobehnout v nejakem konecnem case, navic bych to chtel udelat obecne pro libovolny pocet zadanych sloupcu, takze jednoduche porovnani vsech sloupcu se vsema ostatnima v jinych radkach se mi nelibi. Idealni by bylo ty sloupce nejak seradit podle abecedy, z toho udelat novou tabulku a v ni pak uz jen vyhledat stejne radky. Bohuzel me ale nenapada jak to napsat, poradi nekdo?
    Naposledy upravil Petrik; 16.08.2009 v 20:56.
    desktop: i5-2500K@3700MHz, MSI P67A-C43-B3, 2x4GB Kingston Value, Sapphire 5850 Xtreme 1GB 850/1100, 2xWD10EALX fake RAID-1, LG W2600HP-BF S-IPS,Razer DiamonBack, Seasonic SS-400ET-F3, Windows 7 x64 SP1 + ubuntu x64
    notebook: IBM T41p, 1.7 Pentium M, 14" 1400x1050, 1.5GB RAM, 40GB 4200r, Ubuntu 9.04
    ultraportable: IBM X41, 12" XGA 1.5GHz Dothan, 2GB RAM, 32GB CF Pretec 233x SSD, Ubuntu 9.10
    repro: Teufel Concept E Magnum PE 5.1

  2. #2

    Standardní Re: komplikovanty SQL dotaz

    nepomoh by join tabulky se sebou sama? tzn neco jako:

    select * from tabulka a inner join tabulka b
    where tvoje_porovnavaci_funkce(a.sloupec, b.sloupec)

    to k sobe da podobne radky...
    GigaByte GA-M55plus-S3G --- A64 3200+ @ 24oo ~ 1,375V BOX --- 2x512 Geil 667 CL4 @ 980 CL5 --- WD2500KS --- Acer AL1721ms --- 1/1 MBit/s via WiFi
    Blog

    09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 aneb jeste ze ty "ochrany" programujou rozumny lidi :]

  3. #3

    Standardní Re: komplikovanty SQL dotaz

    V jaké je to DB? MySQL, MS SQL, Oracle?
    -- under construction --

  4. #4

    Standardní Re: komplikovanty SQL dotaz

    mysql 5.0 sorry, inner join je asi nejlepsi reseni, ale i tak to bude trvat hrozne dlouho nez se to porovna, navic napsat to porovnani pro 8 sloupcu je hracka, ale co kdyby jich bylo 100?
    Naposledy upravil Petrik; 16.08.2009 v 21:00.
    desktop: i5-2500K@3700MHz, MSI P67A-C43-B3, 2x4GB Kingston Value, Sapphire 5850 Xtreme 1GB 850/1100, 2xWD10EALX fake RAID-1, LG W2600HP-BF S-IPS,Razer DiamonBack, Seasonic SS-400ET-F3, Windows 7 x64 SP1 + ubuntu x64
    notebook: IBM T41p, 1.7 Pentium M, 14" 1400x1050, 1.5GB RAM, 40GB 4200r, Ubuntu 9.04
    ultraportable: IBM X41, 12" XGA 1.5GHz Dothan, 2GB RAM, 32GB CF Pretec 233x SSD, Ubuntu 9.10
    repro: Teufel Concept E Magnum PE 5.1

  5. #5
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    43
    Příspěvky
    5 153
    Vliv
    345

    Standardní Re: komplikovanty SQL dotaz

    Petrik: Pokud by jich bylo 100, tak se tomu říká prasárna a debilní návrh struktury databáze, protože provozovat takovouhle "chlívárnu" je prostě proti slušnýmu vychování... Můžu se jen ze zájmu zeptat, jak vůbec tenhle s prominutím "bordel" vzniká?
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  6. #6

    Standardní Re: komplikovanty SQL dotaz

    To s tebou Davide musim souhlasit, ale s tim bohuzel nic nenadelam. Ta tabulka vznikla strojovym ctenim dat z nejakych CDcek s katalogama aut, coz predpokladam nebylo uplne snadne. Bohuzel ta databaze je cela dost zprasena, napr. vybava tech aut je v jine tabulce udelana tim stylem, ze co sloupec, to jedna polozka vybavy, takze pridavat tam nove polozky je dost obtizne, sprave by na to mela byt joint table.... kazdopadne to je muj prvni ukol v teto firme a mel bych se ho zhostit nejak elegantne, coz porovnani kazdy s kazdym vazne neni, ale otazka zda to jde udelat nejak jinak je s pomoci SQL.
    desktop: i5-2500K@3700MHz, MSI P67A-C43-B3, 2x4GB Kingston Value, Sapphire 5850 Xtreme 1GB 850/1100, 2xWD10EALX fake RAID-1, LG W2600HP-BF S-IPS,Razer DiamonBack, Seasonic SS-400ET-F3, Windows 7 x64 SP1 + ubuntu x64
    notebook: IBM T41p, 1.7 Pentium M, 14" 1400x1050, 1.5GB RAM, 40GB 4200r, Ubuntu 9.04
    ultraportable: IBM X41, 12" XGA 1.5GHz Dothan, 2GB RAM, 32GB CF Pretec 233x SSD, Ubuntu 9.10
    repro: Teufel Concept E Magnum PE 5.1

  7. #7
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    43
    Příspěvky
    5 153
    Vliv
    345

    Standardní Re: komplikovanty SQL dotaz

    Hele mě nemusíš opravdu vykládat co jsou to nekvalitní data, mě tuhle havarovala automatická aktualizace systému, protože ve sloupci tabulky datového skladu, kde má být alternativní číslo nákladového střediska NEBO NIC najednou byl nějakej bordel... A jelikož to bylo psáno stylem pokud tam NĚCO JE, tak tím přepiš původní číslo střediska, tak do středisek začaly lézt peechoviny

    Ještě teď mě napadl jiný způsob, ale jak jsi správně poznamenal, tak nevím, jak (ne)snadné je realizovat to pomcí SQL, algoritmus by byl zhruba následující (pokud jsem správně pochopil, tak ten "spatlaný" sloupec je vlastně součtem těch předcházejících při oddělení mezerami, je to tak?):

    Pro každý řádek realizuj toto:

    1) Vezmi sloupce 1 až n - AUDI, A4, AVANT...
    2) Neprázdné sloupce sesyp do nové "pracovní" tabulky pod sebe do řádků (INSERT INTO)
    3) Tuto taublku seřaď (ORDER BY) abecedně vzestupně
    4) Jednotlivé řádky tabulky poskládej do nového "zmatlaného" řetězce
    5) Spolu s ostatními údaji řádku původní tabulky to exportuj do nové tabulky, která už bude mít "zmatlané" řetězce v pořadí, na které se dá pak použít akorát ORDER BY klauzulka
    6) Vypláchni pracovní tabulku

    (tohle opakovat pro každý řádek "zdrojové" tabulky).

    Sorry všem, jestli je to ještě větší prasárna, než ta tabulka, nejsem si jist ani časovou náročností, každopádně jsem se to snažil udělat co nejrobustněji a podchytit to víceméně pomocí základních SQL příkazů...
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  8. #8

    Standardní Re: komplikovanty SQL dotaz

    Tohle Ti vyhodí řádky, u kterých není sloupec prasárna stejný jako sloučené předchozí (bez ID) pomocí mezery .

    Struktura asi není přesně stejná jako ta tvá, ale upravit to na tvou strukturu by mělo být jednoduché .

    Kód:
    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `znacka` varchar(100) DEFAULT NULL,
      `model1` varchar(100) DEFAULT NULL,
      `model2` varchar(100) DEFAULT NULL,
      `model3` varchar(100) DEFAULT NULL,
      `prasarna` varchar(1000) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    
    INSERT INTO test VALUES ('', 'Volkswagen', 'Bora', 'Passat', 'Golf', 'Volkswagen Bora Golf Passat');
    INSERT INTO test VALUES ('', 'Skoda', 'Fabia', 'Octavia', 'Superb', 'Skoda Fabia Octavia Superb');
    
    
    
    
    SET @nazvy_sloupcu = (SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'test' AND column_name <> 'id' AND column_name <> 'prasarna');
    
    SET @sql_porovnani = CONCAT('SELECT id, CONCAT_WS(" ", ', @nazvy_sloupcu, ') as sloucene, prasarna FROM test HAVING sloucene <> prasarna');
    
    PREPARE porovnani_stmt FROM @sql_porovnani;
    EXECUTE porovnani_stmt;
    pak si na konci (jinak neuvidíš výsledek) ještě zavolej

    Kód:
    DEALLOCATE PREPARE porovnani_stmt;
    DROP TABLE test;
    EDIT: na testovací data, která nedávají smysl, nehleď a doufám že jsem správně pochopil zadání
    Naposledy upravil Kaltas; 17.08.2009 v 03:46.
    -- under construction --

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Podobná témata

  1. MS Visio export pro MS SQL server
    Založil Commander v sekci fóra Programy a problémy s nimi
    Odpovědí: 0
    Poslední příspěvek: 22.02.2007, 11:58
  2. Jak na SQL
    Založil AXE v sekci fóra Programy a problémy s nimi
    Odpovědí: 4
    Poslední příspěvek: 19.10.2006, 17:45
  3. MS SQL dotaz UPDATE (používaný z ASP.NET)
    Založil xkrchnav v sekci fóra Programování
    Odpovědí: 16
    Poslední příspěvek: 07.12.2005, 20:21
  4. [PHP] Jak na velmi dlooouhy SQL dotaz pres PHP ?
    Založil Aigor v sekci fóra Programování
    Odpovědí: 15
    Poslední příspěvek: 14.03.2005, 13:20
  5. SQL. Databaza na WZ.CZ
    Založil cd-mann v sekci fóra Programování
    Odpovědí: 3
    Poslední příspěvek: 14.11.2003, 10:31

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •