Cześć,
mam taki problem że w jednej tabeli w polu mam zapis AAABBB i ten sam zapis w drugiej tabeli mam rozbity na dwa pola AAA i BBB.
Jak w selekcie zapisać warunek where żeby wyciągnąć te rekordy, które są zawarte w obu tabelach ?
Dzięki.
Cześć,
mam taki problem że w jednej tabeli w polu mam zapis AAABBB i ten sam zapis w drugiej tabeli mam rozbity na dwa pola AAA i BBB.
Jak w selekcie zapisać warunek where żeby wyciągnąć te rekordy, które są zawarte w obu tabelach ?
Dzięki.
Możesz użyć funkcji substr. Mniej więcej tak:
from tab1, tab2 where substr(tab1.col, 0, 3) = tab2.col1 and substr(tab1.col, 3, 3) = tab2.col2
Choć ja osobiście do złączeń używałbym JOINów, jeśli chcesz tylko wiersze, gdzie wartości występują w obu tabelach to zapisałbym to:
from tab1 inner join tab2 on substr(tab1.col, 0, 3) = tab2.col1 and substr(tab1.col, 3, 3) = tab2.col2
Takie zapytanie może być jednak o wiele wolniejsze (przez drugie złączenie) ponieważ nie da się w nim wykorzystać indeksu na tab1.col
dzięki ! ;)
a nie prościej where t1.col = t2.col1 || t2.col2
?
@abrakadaber O ile się nie mylę, to zapytanie sprawdza czy t1.col jest równe t2.col1 lub t2.col2.
Tymczasem pierwsze trzy znaki t1.col mają się równać t2.col1, a pozostałe 3 znaki mają się równać t2.col2. To zapytanie nie rozwiązuje problemu tu zadanego.
A tak nawiasem mówiąc, jak na mój gust to źle zaprojektowana jest baza, jeśli wymaga takich dziwnych kombinacji (choć mogę się mylić, z baz raczej średniak jestem :P).
Edit: Fakt, jeśli to wygląda tak jak zostało opisane (te napisy są, że tak powiem, nie nachodzą na siebie) to złączenie tych dwóch stringów będzie prostszym rozwiązaniem.
Dzięki za podpowiedzi.
Co do projektu bazy to problem dotyczy rachunku NRB, który w różnych tabelach jest w różny sposób prezentowany w zależności od tego co komu pasowało i było potrzebne. Stąd teraz takie kombinacje starając się połączyć dwie tabele z tym samym rachunkiem tylko inaczej pociętym.
Thx.
mk napisał(a):
Możesz użyć funkcji substr. Mniej więcej tak:
from tab1, tab2 where substr(tab1.col, 0, 3) = tab2.col1 and substr(tab1.col, 3, 3) = tab2.col2
Choć ja osobiście do złączeń używałbym JOINów, jeśli chcesz tylko wiersze, gdzie wartości występują w obu tabelach to zapisałbym to:
from tab1 inner join tab2 on substr(tab1.col, 0, 3) = tab2.col1 and substr(tab1.col, 3, 3) = tab2.col2
Takie zapytanie może być jednak o wiele wolniejsze (przez drugie złączenie) ponieważ nie da się w nim wykorzystać indeksu na tab1.col
Przecież jedno i drugie to dokładnie to samo. W tego typu przypadkach czy używasz where, czy join, na niższym poziomie dostajesz ten sam plan zapytania; wyłącznie kwestia gustu, którą opcję wybierzesz.