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)
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.
Puhut tietokannasta. Eli pitäisi vertailtailla kantoja ja jokaisen taulun välillä käydä vertailu läpi? Kannassa voi olla satoja tauluja. Ehkä vain ensimmäisen katsoisin sen kannan transaktio logista, mikä rivi poiistettu. Olisi nopein.
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.
Tyhmä, opettele työsi ennen kuin kyselet
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);
Miksi hakisin tuollaista suorittavan työn paikkaa?
Vierailija kirjoitti:
Painan ctrl-Z.
Minä painan ctrl-alt-del ja lähden kotiin.
Vierailija kirjoitti:
Miksi hakisin tuollaista suorittavan työn paikkaa?
"Ei tarvitse osata mitään kun alaiset tekee kaiken"?
Etit vaan nopealla hakusanalla kummassa rivi on tallella, ja siinä se
Tiputtaisin molemmat tietokannat Word-dokumenteiksi ja sitten käyttäisin Vertaa asiakirjoja -toimintoa.
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);
Except on myös hyvä, ehkä tehokkaampikin.
Vastauksesi osoittaa loogista ajattelua, mutta työhaastattelutilanteessa odotetaan usein tehokkaampaa, teknisesti optimoitua ratkaisua varsinkin jos haet tekniseen tai IT-alan tehtävään.
Mikä olisi parempi vastaus?
Riippuen tietokannan koosta ja käytössä olevista työkaluista, tehokkaampi tapa olisi:
1. SQL-kyselyllä erot
Jos kyseessä on relaatiotietokanta (esim. PostgreSQL, MySQL), voit tehdä EXCEPT-operaation (tai vastaavan) kahden taulun välillä:
sql
CopyEdit
SELECT * FROM tietokanta1.taulu EXCEPT SELECT * FROM tietokanta2.taulu;
Tämä palauttaa rivit, jotka ovat vain ensimmäisessä tietokannassa, eli poistettu rivi.
Joissain tietokannoissa (esim. MySQL) EXCEPT ei ole suoraan tuettu, mutta voit käyttää LEFT JOINia ja IS NULL -ehtoa:
sql
CopyEdit
SELECT a.* FROM tietokanta1.taulu a LEFT JOIN tietokanta2.taulu b ON a.primary_key = b.primary_key WHERE b.primary_key IS NULL;
2. Hash-tarkistus
Jos rivejä on todella paljon, voit laskea esimerkiksi jokaisesta rivistä hashin (esim. SHA256) ja vertailla listoja:
sql
CopyEdit
SELECT SHA2(CONCAT_WS(',', sarake1, sarake2, sarake3), 256) AS hash FROM taulu;
Sitten vertailet hasheja ja etsit puuttuvan.
Yhteenveto:
Vastaus vertaan visuaalisesti rivi riviltä on looginen mutta tehoton.
Parempi vastaus olisi käyttää SQL:ää tai ohjelmallista ratkaisua erotusten etsimiseen.
Työhaastattelussa kannattaa viestiä, että ymmärrät sekä ongelman logiikan että osaat käyttää tehokkaita työkaluja sen ratkaisemiseen.
Oikea vastaus olis ollu, että painaisin sitä back-nuolta.
Siis oliko tämä logiikkakysymys tai joku kompa? Teknisestihän tuon voi tehdä helposti miten vain mutta ehkä työhaastattelussa kysymyksen merkitys on eri.
Itse en haastattelutilanteessa varmasti osaisi mitenkään järkevästi tuohon vastata vaikka koodaan ja teen tietokantatöitä jatkuvasti. Osaan tehdä nuo asiat itsekseni mutta en pysty sosiaalisissa tilanteissa niitä selittämään.
Haetko työtä jossa vaaditaan Office-ohjelmistojen osaamista tai olet väittänyt tuntevasi ne? Tuo tehtävä vaikuttaa excel-harjoitukselta.
Tuskin olit vakavissasi kertoessasi oman ratkaisusi.
Itse etsin poistetun rivin roskakorista, eikös vieläkin käytetä reikäkortteja?
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
Puhutaanko nyt oikeista tietokannoista ja pitäisi tehdä SQL-lause, jolla asia selvitetään vai esim. kahdesta Excel-taulukosta (jotka eivät ole siis oikeita tietokantoja)?