Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: novotný 14. 10. 2016, 07:49:04

Název: Porovnávaní hodnot v databázi
Přispěvatel: novotný 14. 10. 2016, 07:49:04
Zdar, mám dvě tabulky v MariaDB, kde jsou téměř totožní data.
První tabulka má data ze včerejška a druhá z dneška.
Změn je tak 1% z celkového počtu dat (řádků cca 10 000, sloupců 20).
Sloupce jsou převážně stringy (12 sloupců VARCHAR(15), 8 sloupců INT).
Jak by ste doporučovali hledat změny v datech?
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: Ivan Nový 14. 10. 2016, 08:20:44
Zdar, mám dvě tabulky v MariaDB, kde jsou téměř totožní data.
První tabulka má data ze včerejška a druhá z dneška.
Změn je tak 1% z celkového počtu dat (řádků cca 10 000, sloupců 20).
Sloupce jsou převážně stringy (12 sloupců VARCHAR(15), 8 sloupců INT).
Jak by ste doporučovali hledat změny v datech?

Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak

Pokud hledáte co není v tabulce t1 a je v tabulce t2:

SELECT * FROM t1 WHERE t1.key_content NOT IN (SELECT t2.key_content FROM t2)

Pokud hledáte co není v obou tabulkách současně pak

SELECT * FROM t2, t2 WHERE t1.reference = t2.reference AND t1.key_content <> t2.key_content


Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: sql_lopata 14. 10. 2016, 09:35:49
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
Kód: [Vybrat]
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: dustin 14. 10. 2016, 09:52:54
Záleží, co potřebuješ. Také je možné pustit diff na sql dumpech

http://stackoverflow.com/questions/225772/compare-two-mysql-databases/8718572#8718572
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: alda 14. 10. 2016, 10:03:57
a co tak pouzit proste minus, s vynechanim technickych sloupcu?

select
 columns ....
from t1

minus

select
 columns ....
from t2

Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: novotný 14. 10. 2016, 10:04:21
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content
Díky, to je ono.
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: Ivan Nový 14. 10. 2016, 12:49:30
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
Kód: [Vybrat]
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
jj, to je pravda. Stačí přidat mezi pole oddělovač, například '|' aby to bylo jednoznačné.
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: Ivan Nový 14. 10. 2016, 13:21:01
V MariaDB existuje i funkce CONCAT_WS, která umožňuje zadat oddělovač jako parametr.
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: sql_lopata 14. 10. 2016, 14:52:53
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
Kód: [Vybrat]
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
jj, to je pravda. Stačí přidat mezi pole oddělovač, například '|' aby to bylo jednoznačné.
Kód: [Vybrat]
CONCAT('aa|', '|', 'bb') -> 'aa||bb'
CONCAT('aa', '|', '|bb') -> 'aa||bb'
Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: Ivan Nový 14. 10. 2016, 15:10:27
Do tabulek přidat pole, které bude obsahovat MD5(CONCAT(pole_1, pole_2, ...)) nazvané třeba key_content, pak
Kód: [Vybrat]
CONCAT('aa', 'bb') -> 'aabb'
CONCAT('aab', 'b') -> 'aabb'
jj, to je pravda. Stačí přidat mezi pole oddělovač, například '|' aby to bylo jednoznačné.
Kód: [Vybrat]
CONCAT('aa|', '|', 'bb') -> 'aa||bb'
CONCAT('aa', '|', '|bb') -> 'aa||bb'

Ano, to je pravda, moc jsem o detailním řešení nepřemýšlel, ale řešitelné to je:

Kód: [Vybrat]
CONCAT_WS('|', TO_BASE64(pole_1), ...)

Název: Re:Porovnávaní hodnot v databázi
Přispěvatel: Karel 14. 10. 2016, 17:27:21
Nevím, zda to má konrétně MariaDB, ale v ANSI SQL jde použít konstrukce:

select * from table1
where (c1, c2, c3, c4, c5, c6) not in (select c1, c2, c3, c4, c5, c6 from table2)

http://stackoverflow.com/questions/2956048/sql-where-x-in-select-y-from

Ještě jsem viděl použití outer joinu:

select t1.*, t2.id as t2id from table1 t1 left outer join table2 t2 on t1.c1 = t2.c1 ....

A z toho pak vyfiltrovat záznamy, kde t2id je null.

Případně se poohlédnout po EXISTS, respektive NOT EXISTS