Left join z funkcją replace

0

Witam,

Z poniżyszych dwóch tabel chciałbym wykonać kwerendę LEFT JOIN.

Jedynym wspólnym mianownikiem dla obu tabel jest USERID, który jednak będzie taki sam w obu tabelach tylko wtedy, gdy do całej kwerendy dodam polecenie usuwające wartość "XYZ_".

Wiem, że aby usunąć "XYZ_" mogę użyć "SELECT REPLACE", jednak problemem dla mnie jest wymyslenie, jak wkomponować to w LEFT JOIN.

Tabela 1.

USERID NAME
XYZ_1234 RAMBO

Tabela 2.

USERID LOGIN_TIME
1234 12:00

Po odpaleniu kwerendy chciałbym otrzymać NAME i LOGIN_TIME.
Nie chciał bym również edytowac Tabela 1., poprzez trwałe usunięcie "XYZ_".

Używam Oracle SQL Developer.

Z góry dzięki!

0

Nie możesz przerobić tabeli tak, aby tam tego xyz_ nie było?
W aktualnej wersji baza nie będzie mogła wykorzystać indeksu, więc wyszukiwanie będzie wolne.

Jeśli nie możesz ruszać struktury tabeli, może przydatna będzie tutaj klauzula with.

0

Niestety nie mogę usunąć "xyz_", ponieważ jest używane przez inne tabele.
Dzięki za podpowiedź odnosnie WITH. Spróbuje coś wykombinować jednak może zająć to trochę czasu :)

0

A to nie zadziała?

select 
*
from
 a
inner join b on a.userid = replace(b.userid,'xyz_')
3

ŁAtwiej dodać, niż usunąć...
SELECT * FROM a LEFT JOIN b ON 'xyz_' || a.user_id=b.user_id
|| to konkatenacja

0

Dzięki za odpowiedzi.

Spróbowałem odpalic coś takiego:

SELECT T1.NAME, T2.LOGIN_TIME
FROM Table1 T1
LEFT JOIN Table2 T2 ON 'XYZ_' || T1.USERID=T2.USERID

Niestety w kolumnie 'LOGIN_TIME' mam tylko wartości (null).

Dodam, że 'LOGIN_TIME' w table2 występuje najczęsciej więcej niż jeden raz dla poszczególnego "USERID". Natomiast w table1 każde USERID występuje tylko 1 raz.
Zależy mi na otrzymaniu takiego 'LOGIN_TIME', który jest najbliższy dzisiejszej dacie.
Może powyzszy fakt ma wpływ na kwerendę?

Dzieki!

0

Daj na jakiegoś fiddla przykładowe dane, i opisz oczekiwany wynik...

0

Posilkując się tym co napisałeś w pierwszym poście to to xyz_ dodajesz nie do tej kolumny:

tabela1 t1 ma userid: xyz_123
tabela2 t2 ma userid: 123

Więc to xyz_ musisz dodać do pola w tabeli T2:

SELECT T1.NAME, T2.LOGIN_TIME
FROM Table1 T1
LEFT JOIN Table2 T2 ON T1.USERID='XYZ_' || T2.USERID
0

@Panczo: dzięki, właśnie o to mi chodziło. SQLem zacząłem zajmować się od niedawna i zdarzają mi się takie proste błędy które zauważam dopiero po ciężkiej walce.

@Marcin.Miga również dzięki za podrzucenie pomysłu.

Teraz zabieram sie za wymyslenie, jak w tabeli pokazać "LOGIN_TIME" najbliższy dzisiejszej daty. W razie problemów na pewno się odezwę.

Pozdrawiam!

0

Witam ponownie,

Niestety musze się poddać i poprosić was o pomoc.
Do kwerendy wspomnianej powyżej przez @Panczo próbuję dodać funkcję MAX, która wyrzuci my tylko najświeższe "LOGIN_TIME" dla danego "NAME".

Jedyne co udało mi się wymyślić to:

SELECT T1.NAME, MAX(T2.LOGIN_TIME)
FROM Table1 T1
LEFT JOIN Table2 T2 ON T1.USERID='XYZ_' || T2.USERID
GROUP BY T1.NAME

Kwerenda niestety nie działa. Podejrzewam że pod "LEFT JOIN" trzeba dodać subkwerende "SELECT", jednak mimo kilkunastu prób nie udało mi się osiągnąć rezultatów.

0

Uwielbiam posty w stylu
Kwerenda niestety nie działa

0

Napisałem tak bo się poddałem po chyba 4rech godzinach.
No nic, prześpie się z tym i będę dalej walczył.

Pozdrawiam

0

Tu nie chodzi o to że chcemy się z Ciebie ponabijać, tylko, że podałeś zapytanie, które jest prawidłowe, ale stwierdziłeś, że nie działa. Patrz jest taka strona: http://sqlfiddle.com/
Umieść przykładowe dane, napisz zapytanie, które nie działa, opisz w czym problem. W przeciwnym razie ciężko doradzić...

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