Wpis z mikrobloga

Mam takie tabele:

[tab1]
(id)(kod)(wartość)
1, 'x', 'a'
1, 'y', 'b'
2, 'x', 'c'
2, 'y', 'd'
...

[tab2]
(id)(kod)(wartość)
1, 'x', 'a'
1, 'y', 'b'
2, 'x', 'c'
2, 'y', 'd'
...

Muszę złączyć tabele tak, żeby przypisać do tab1 tab2 dla tego samego id + po wierszu kod do tego samego kodu, żeby nie zrobiło mi przemnożenia, tj

1, 'x', 'a', 'x', 'a'

jeśli zrobię tylko po kluczu(id) to będe miał wszystkie możliwości z tabeli 2 doklejone do tabeli 1(nie ważne jaki join) bo jest to specyficzna tabela, gdzie jedna tabela zawiera się w wielu wierszach.

Problem jest taki, że tylko id to klucz. Mogę zrobić joina po id and tab1.kod = tab2.kod, ale jest to złączenie po wartościach niekluczowych i tak jak działa w selectcie, tak update nie pozwala mi się wykonać na pl/sql. Jakiś pomysł?

Myślę nad tym, żeby przetransformować tabele w taki sposób, żeby wyszło:
[tab1]
(id)(x)(y)
1, 'a', 'b'
2, 'c', 'd'

[tab2]
(id)(x)(y)
1, 'a', 'b'
2, 'c', 'd'

Wtedy mogę zrobić złączenie po kluczach i update go puści. Natomiast za #!$%@? nie wiem jak to przerobić w wierszy na tabelę xD
Kto mi pomoże, temu puszczę piwko ( ͡° ͜ʖ ͡°)

#programowanie #bazydanych #informatyka
  • 5
@JBFC: po pierwsze, to kluczem powinno być (id, kod), a nie samo id, bo przecież masz w przykładzie powtarzające się id w tabelach.

Albo dałeś zły przykład, albo coś źle mówisz - nawet fizycznie nie da się zrobić klucza na nieunikalnej kolumnie.

Po drugie można by chyba zrobić update z podselektem, ale bardzo nieoptymalnie będzie, lepiej chyba w pętli lecieć po wynikach tego selekta i robić pojedyńcze updejty.
@JBFC: jeśli tabela nie ma klucza głównego to działa tak, jakby wszystkie kolumny razem były kluczem. Jak możesz, to zdefiniuj klucz na (id, kod).

A jak koniecznie chcesz to zrobić updatem to możesz coś w tym stylu (nie testowałem, pisanie z palca na szybko):

update tab1
set kod2=(select kod from tab2 where tab2.id=tab1.id and tab2.kod = tab1.kod),
wartosc2=(select wartosc from tab2 where tab2.id=tab1.id and tab2.kod = tab1.kod);

No i potem w