Työhaastattelussa: sinulla on kaksi samanlaista tietokantaa. Toisesta poistetaan rivi. Miten saat selville, mikä rivi poistettiin?
Vastasin, että laitan tietokannat vierekkäisiin ikkunoihin ja alan rivi riviltä vertailla. Onko tämä oikea vastaus? Panostahan siinä aikanaan tulee sen kohdalle, jota ei toisesta löydy!
Kommentit (70)
Vierailija kirjoitti:
Luultavasti ekaksi katsoisin logista mikä käsky on suoritettu viimeksi siihen mistä on poistettu jotain.
Entä jos rivi poistettiin jo kaksi kuukautta sitten? Mutta, lokien selailu on ylläpitäjän hommia, niihin ei muut edes pääse käsiksi. Jotain muuta ratkaisua tässä haetaan. Toimiva SQL-lause on toki triviaali ja kerrottu heti ensimmäisissä vastauksissa, mutta ehkä tässä ei ollut kyse siitä.
Vierailija kirjoitti:
Tyhmä tapa on vertailla kantojen sisältöä koska kannat voi olla todella suuret. Älykkäämpi on hakea se käsky jolla poisto on suoritettu tavalla tai toisella. Jossain logissa nuo muutoskäskyt kait on luulisin?
Voihan sitä vaikka dumpata molemmat (lajitellut) kannat tekstiriveiksi ja sitten ottaa diff:in joka kertoo mikä rivi on erilainen :D
Voi kuule nykyajan tietokannat antavat millisekunneissa vastauksen indeksikyselyyn SELECT * FROM a WHERE Id NOT IN (SELECT DISTINCT Id FROM B) vaikka taulun koko on miljoonia rivejä. Ei kannata pähkäillä tuntikausia kustannustehokkaampaa tapaa selvittää asia.
Vierailija kirjoitti:
Vierailija kirjoitti:
Antaisin ChatGPT:n tehdä homman.
Onpas tietoturva hyvässä kunnossa, jos chatgpt pääsisi tietokantaan käsiksi.
Luottamuksella kaikki tiedot vaan, NSA vartioi
Vierailija kirjoitti:
Vierailija kirjoitti:
Vierailija kirjoitti:
Onko tosiaan kysymys kahdesta eri tietokannasta vai kahdesta taulusta? Jälkimmäinen olisi tosi helppo tehdä yhdellä SQL-kyselyllä, mutta edellisen osaisin tehdä vain kirjoittamalla muuta ohjelmakoodia SQL:n lisäksi.
Ap:n vastaus oli minusta joka tapauksessa huono.
Select avainsarake molemmista, lajittelee ja sitten vertaa rivi riviltä. Sen voi tehdä myös tehokkaammin mutta tuo on yksinkertainen ratkaisu.
Jos kysymys on kahdesta tietokannasta, niin niissä voi kummassakin olla satoja tauluja. Eli tuo juttu pitäisi toistaa tietokannan jokaiselle taululle.
Mutta jos kysymys on kahdesta taulusta, niin ratkaisu on helppo:
SELECT *
FROM Taulu1 WHERE avainsarake NOT IN
(SELECT avainsarake
FROM Taulu2);
Oliko kyse tietokannoista, jotka ovat toisiinsa yhteydessä, vai pitääkö ensin data siirtää paikasta 1. paikkaan 2. vertailua varten?
Vierailija kirjoitti:
Vierailija kirjoitti:
Tyhmä tapa on vertailla kantojen sisältöä koska kannat voi olla todella suuret. Älykkäämpi on hakea se käsky jolla poisto on suoritettu tavalla tai toisella. Jossain logissa nuo muutoskäskyt kait on luulisin?
Voihan sitä vaikka dumpata molemmat (lajitellut) kannat tekstiriveiksi ja sitten ottaa diff:in joka kertoo mikä rivi on erilainen :D
Voi kuule nykyajan tietokannat antavat millisekunneissa vastauksen indeksikyselyyn SELECT * FROM a WHERE Id NOT IN (SELECT DISTINCT Id FROM B) vaikka taulun koko on miljoonia rivejä. Ei kannata pähkäillä tuntikausia kustannustehokkaampaa tapaa selvittää asia.
Miljoonien rivien taulu ei olekaan kovinkaan suuri.
Vierailija kirjoitti:
Vierailija kirjoitti:
Riippuu tietokannasta, mutta luettavassa olevassa muodossa on helppo etsiä eroavaisuus tuetokannan vertailutoiminnalla..
tosin sitä ennen kysyisin onko versiohistorian tallennus päällä ja katsoisin sen kautta, mitä kohtaa on muutettu, jos tämä on ollut viimeisen muutos kompakysymykseen ctrl+z
Tietokannassa ei ole rivejä, tietokannan tauluissa on. Mutta ehkä tämä oli ap:n käännösvirhe.
Versiohistorian kaivelu kuulostaa kannan ylläpitäjän tehtävältä. Jos ap haki ylläpitotehtäviin, niin tuskin on tarvetta kysellä tällaisia.
Tehtävä vaatisi hieman taustatietoja. Tarkoitetaanko oikeasti tietokantoja ja onko kyseessä työ jossa ajetaan SQL-kyselyjä, vain käsitelläänkö tietojoukkoja Excelillä.
Jos tietokannan tauluissa on rivejä niin kyllähän ne rivit ovat tietokannassa.
Kysymyksen perusteella oletan, että tietokanta on vakaassa tilassa poiston jälkeen, eli uusia tapahtumia ei virtaa sisään poiston jälkeen. Sitten katsoisin molempien tietokantojen tapahtumalokin viimeisen tapahtuman, aikaleimasta näkee kumpi on myöhempi.
Jos loki ei ole päällä, on selvitettävä tietokantojen käyttöön liittyviä yksityiskohtia esim. alkaen siitä, onko kyseessä SQL-tietokanta ja pääseekö molempiin käsiksi samanaikaisesti.
Tietokannassa ei ole rivejä, tietokannan tauluissa on. Mutta ehkä tämä oli ap:n käännösvirhe.
Versiohistorian kaivelu kuulostaa kannan ylläpitäjän tehtävältä. Jos ap haki ylläpitotehtäviin, niin tuskin on tarvetta kysellä tällaisia.
Tehtävä vaatisi hieman taustatietoja. Tarkoitetaanko oikeasti tietokantoja ja onko kyseessä työ jossa ajetaan SQL-kyselyjä, vain käsitelläänkö tietojoukkoja Excelillä.