Oracle - czy takie zapytanie da się napisać

0

Witam,
Mam tabelę, w której mam dwie kolumny string, int.
Tzn, Imię, wiek: Ta kolumna nazywa się Osoba.
Mam też inną tabelę DUŻA gdzie mam dużo różnych kolumn. Jest w śród nich kolumna: nazwa (string) oraz ilość (int)
Czy mogę teraz zadać takie pytanie w Oracle (pytam, bo chcę wiedzieć a nie mam dostępu, żeby to sprawdzić)

SELECT * FROM DUŻA WHERE (Duża.nazwa, Duża.ilość) IN Osoba.

Chciałbym, aby to zapytanie wybrało te wiersze z Duża, które mają swoje odpowiedniki w tabeli "Osoba", tzn jest wiersz imię równy wartosci pola nazwa oraz w tym samym wierszu wartosc pola wiek = wartosci pola ilosc

0

SELECT * FROM Duża JOIN Osoba ON (tutaj porównanie wspólnych kolumn w tabeli Duża i Osoba) WHERE (tutaj warunki, które chcesz, aby były spełnione)

edit.

jak w ogóle możesz cokolwiek testowac bez testów?

edit.

po co w ogóle Ci tabela Osoba skoro WSZYSTKIE dane z Osoba i tak trzymasz w Duża?

0

Oj, no zadałem pytanie teoretyczne. Odpowiedz na nie, wiem jak się pisze zapytani.

0

@xawery no chyba jednak nie wiesz jak skoro nie wiesz co to jest join.

0

Zrozumiał ktoś pytanie ? Na litośc, ja własnie chcę zrobić to bez JOINA

0

SELECT * FROM DUZA AS D WHERE ( SELECT * FROM MALA AS M WHERE D.imie = M.imie AND D.wiek = M.wiek)

0
  • SELECT * FROM DUZA AS D WHERE EXISTS( SELECT * FROM MALA AS M WHERE D.imie = M.imie AND D.wiek = M.wiek)
0
xawery napisał(a):

Zrozumiał ktoś pytanie ? Na litośc, ja własnie chcę zrobić to bez JOINA

A gdzie o tym niby wspominasz, to raz. Dwa, optymalizator kosztowy i tak zmieni to podzapytanie na joina, więc nie bardzo rozumiem po co kombinować.

0

@Shalom: mam pytanie związane z tematem.

Jak wiadomo JOINy są fajne póki nie tworzymy złączeń między wielkimi, a małymi tablicami (a optymalizator chyba może się sporadycznie pomylić).

Czy prawdą jest, że query hint w Oracle może służyć do takiego sterowania optymalizatorem, aby np. powstrzymać go przed zrobieniem JOINa jeśli wiemy, że na pewno nie chcemy zrobić złączenia?

0

Optymalizator zwykle dobierze poprawnie algorytm i nie będzie złączał w złej kolejności ;)
Co do pytania to nie do końca rozumiem. Konieczność złączenia wynika z zapytania a nie z optymalizatora. Jak nie chcesz złaczenia to nie pisz zapytania które ma złączenie/podzapytanie.

0

@Shalom: moje pytanie jest bardziej ogólne, może powinno być w oddzielnym temacie.

Czy query hints to narzędzie do modyfikowania planu zapytania? Czy w ten sposób mogę sterować planem zapytania?

Z tego co przeczytałem to odpowiedź to tak.

Wiem, że w PostgreSQL nie ma takiej możliwości, gdyż twórcy uznali, że query hints są zwodnicze i powodują, że aplikacja wymaga częstej refaktoryzacji.

0

To nie jest narzędzie do modyfikowania planu zapytania, tylko do uzupełniania metadanych optymalizatora. Optymalizator często musi bardzo szybko zdecydować jak wykonać dane zapytanie (bo przecież czas optymalizacji nie może dominować czasu wykonywania zapytania!) więc ma ograniczone możliwości. Więc jak mu coś sugerujesz to spora szansa że z tego skorzysta, nawet jeśli nie jest to dobry pomysł ;] Niemniej jednak jeśli to jest np. procedura to optymalizator ma czas sobie ogarnąć jak to zrobić optymalnie.

0

Można tak:

SELECT * FROM DUŻA WHERE (Duża.nazwa, Duża.ilość) IN (SELECT IMIE, WIEK FROM OSOBA); 
 

To że piszesz zapytanie używając określonej składni, nie oznacza, że zapytanie zostanie przez Oracle wykonane w taki sposób jaki sobie wyobrażasz.

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