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...
Re: komplikovanty SQL dotaz
V jaké je to DB? MySQL, MS SQL, Oracle?
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?
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á?
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.
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 :-D
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ů...
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í