Różnica dwóch zapytań

0

Dane są dwie relacje R i S posiadające wspólny atrybut połączeniowy. Relacja R zawiera atrybut A:

Q1: SELECT R.A FROM R, S WHERE R.B = S.B;

Q2: SELECT R.A FROM R WHERE R.B IN (SELECT S.B FROM S);

Mógłby mi ktoś wskazać różnicę między Q1 a Q2?

0

zrób plan zapytania, wtedy zobaczysz jakie są różnice

0

mógłbym poprosić moderatora o usunięcie poprzedniej wypowiedzi?? przypadkowo dotknięty touchpad dodał nazbyt wcześnie nowy post.
także, jeszcze raz:

w zasadzie to jest zadanie jednego z testów z których się przygotowuje do własnego egzaminu.
są cztery możliwe odpowiedzi:

  1. Zapytania są identyczne - gdzie nie ma znaczenia kolejność krotek
  2. Wynik zapytania Q1 zawsze zawiera się w wyniku zapytania Q2
  3. Wynik zapytania Q2 zawsze zawiera się w wyniku zapytania Q3
  4. zapytania Q1 i Q2 generują różne wyniki

poprawnej odpowiedzi nie znam - znam natomiast złą. tą zła jest pierwsza opcja, która była moim wyborem.
Później polecenia przetestowałem na analogicznej bazie i dostawałem takie same wyniki zapytań. Gdzie zatem jest różnica? W jakim wypadku te zapytania zwrócą coś innego? Czy jedna będzie się zawierała w drugiej?

0

jeśli kolejność krotek nie ma znaczenia, to odp od 1 do 3 są prawdziwe bo w obu przypadkach będą takie same sam zbiory wynikowe

BTW ...w odp.3 zamiast Q3 chyba powinno być Q1

0

Mi też się tak wydawało, @grzegorz_so. Jednak w poleceniu zadania jasno podkreślono: zaznacz tylko jedną odpowiedź.

0

dla mnie jedyna różnica to sposób realizacji zapytania przez silnik bazy. Przy dużych tabelach czas wykonania drugiego zapytania może być nieakceptowalny.
Oczywiście przy założeniu że tabele posiadają odpowiednie indeksy. Bez indeksów pewnie nie będzie większej różnicy w czasie wykonania

0

no to może takie zapytania, których tyczy to samo kryterium odpowiedzi co wyżej:

Q1: SELECT A, B FROM R;

Q2: SELECT A, B FROM R GROUP BY A, B

I tu znowu pierwsza odpowiedź która mi się nasunęła to pierwsza (zapytania są identyczne). Jednak ta również jest błędna. Zatem prawidłową będzie odpowiedź numer 2? Q2 zdaje mi się być tą "szerszą" która pomieści w sobie Q1. Mam rację?

0

Klauzulę group by zwykle stosuje się wraz z funkcją agregującą.
Wynik drugiego zapytania zwróci to samo co

select distinct a,b from r

Q1 jest szersze i zawsze będzie zawierało w sobie wynik Q2

0

Wynik drugiego zapytania zwróci to samo co select distinct a,b from r

W takim razie cały rezultat Q2 znajdzie się w Q1 (odpowiedź 3).

Skoro to grupowanie o którym była mowa poprzednio zwraca to samo co SELECT DISTINT A, B FROM R to znaczy, że jest również równoważne z(SELECT a, b FROM r) UNION (SELECT a,b FROM r)?

0

pfu, oczywiście chodziło mi o odpowiedź 2! jedno myślę, drugie piszę.

0

tak, będzie równoważne, tylko po co UNION ??
union bez all zadziała tak jak distinct

0

pytam czysto hipotetycznie, przygotowuje się do egzaminu i mam porównania poleceń. baaardzo mocno dziękuje za pomoc Grzegorz!

2
Błękitny Pomidor napisał(a):

Dane są dwie relacje R i S posiadające wspólny atrybut połączeniowy. Relacja R zawiera atrybut A:

Q1: SELECT R.A FROM R, S WHERE R.B = S.B;

Q2: SELECT R.A FROM R WHERE R.B IN (SELECT S.B FROM S);

Mógłby mi ktoś wskazać różnicę między Q1 a Q2?

Zapytania nie są tożsame.
Byłoby tak, gdyby S.B było unikalne, ale nic o tym nie wiemy.
http://sqlfiddle.com/#!9/d88dc2/1
Jak spojrzysz, to zobaczysz, że zapytanie 1 zwraca więcej rekordów

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