Porovnávaní hodnot v databázi

novotný

Porovnávaní hodnot v databázi
« kdy: 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?


Ivan Nový

Re:Porovnávaní hodnot v databázi
« Odpověď #1 kdy: 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



sql_lopata

Re:Porovnávaní hodnot v databázi
« Odpověď #2 kdy: 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'

dustin

Re:Porovnávaní hodnot v databázi
« Odpověď #3 kdy: 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

alda

Re:Porovnávaní hodnot v databázi
« Odpověď #4 kdy: 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



novotný

Re:Porovnávaní hodnot v databázi
« Odpověď #5 kdy: 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.

Ivan Nový

Re:Porovnávaní hodnot v databázi
« Odpověď #6 kdy: 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é.

Ivan Nový

Re:Porovnávaní hodnot v databázi
« Odpověď #7 kdy: 14. 10. 2016, 13:21:01 »
V MariaDB existuje i funkce CONCAT_WS, která umožňuje zadat oddělovač jako parametr.

sql_lopata

Re:Porovnávaní hodnot v databázi
« Odpověď #8 kdy: 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'

Ivan Nový

Re:Porovnávaní hodnot v databázi
« Odpověď #9 kdy: 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), ...)


Karel

Re:Porovnávaní hodnot v databázi
« Odpověď #10 kdy: 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