Uproszczenie sqlki cross join

0

są takie tabelki i kotom umiejacym drapac o id > 3 trzeba nadać umiejetnosc 'tworzenie szkod'.

koty: |id|imie|
umiejetnosci: |id|nazwa|
kot_ma_umiejetnosc: |kot_id|umiejetnosc_id|

INSERT INTO kot_ma_umiejetnosc
SELECT kot.id,
       um.id
FROM koty kot
CROSS JOIN umiejetnosci um
WHERE um.nazwa = 'tworzenie szkod'
  AND kot.id > 3
  AND kot.id IN
    (SELECT k.id
     FROM koty k
     JOIN kot_ma_umiejetnosc kmu ON k.id = kmu.kot_id
     JOIN umiejetnosci u ON u.id = kmu.umiejetnosc_id
     WHERE u.nazwa = 'drapanie');

da się to zrobić prośceij / lepiej? czy coś takiego jako zadanko z sql na rozmowie można uznać za banalne/łatwe/średnie ?

0

zakładając że przed zapytaniem możemy pozyskać najpierw id umiejętności drapanie i tworzenie szkód do zmiennych to zapytanie sprowadza się do prostego

INSERT INTO kot_ma_umiejetnosc
SELECT kot.id, @tworzenie_szkod
FROM koty kot
JOIN kot_ma_umiejetnosc um ON um.kot_id = kot.id
WHERE kod.id > 3 AND um.id = @drapanie

co powinno być znacząco szybsze
zadanie oceniłbym na proste / średnie

0

Karolina widzę, że usunęłaś zadanie, ale z tego co czytałem wczoraj zamiast "IN" mogłabyś użyć "exists" które daje lepszą wydajność(Jeżeli dobrze pamiętam zadanie), na pewno złapałabyś jakiś dodatkowy punkcik.

Widzę, że jesteśmy w podobnej sytuacji, że zaraz staniemy na przeciwko rekruterów ;-)

Powodzenia!Pozdrawiam! ;-)

EDIT: Po ponownym udostępnieniu zadania.(@Shalom ;-) )

Tak jak napisałem, exists będzie tutaj lepszym rozwiązaniem, jak tylko znajdzie kotka to przestanie szukać. IN najpierw wszystko wyjmie i wtedy porówna.

PS.Nie chce zaczynać dyskusji na temat optimizerów poszczególnych serwerów i ich inteligencji ;-) .

1 użytkowników online, w tym zalogowanych: 0, gości: 1