Update dla wielu kolumn Access

0

Cześć,

mam takie relacje oraz tabele:

Screenshot_14.png

Kwestia idzie o update tabeli tblDescription na podstawie danych z Excela (dodalem tabele ExcelTempTable), które nie mają unikalnego numeru.
Tabela z Excela ma takie same kolumny jak tblDescription plus dodatkowo osobę do każdego rekordu przypisaną (Person z tabeli tblPeople)

Jak to zrobić?
Dane w excelu mogą być zaktualizowane, usuniete, albo dodane nowe, np. w wierwszu 2 zmini sie rozmiar nosa z Big na Medium.

Jakis gosc mi podpowiedział żebym uzyl do updated'u i dodania nowego rekordu takiego sqlk'a:

update tblDescription as t1 left join ExcelTempTable as t2 on 
    ti.[eyecolor] = t2.[eyecolor] and 
    t1.[hairstyle] = t2.[hairstyle] and 
    t1.[noseshape] = t2.[noseshape] 
set 
    t1.[eyecolor] = t2.[eyecolor], 
    t1.[hairstyle] = t2.[hairstyle], 
    t1.[noseshape] =  t2.[noseshape];

Aby usunac wiersz z tabeli tblDescription:

delete t1.* from tblDescription as t1 
    where t1.[eyecolor] & t1.[hairstyle] & t1.[noseshape] 
       not in 
    (select [eyecolor] & [hairstyle] & [noseshape] from ExcelTempTable);

ale jak zmienie coś w tabeli ExcelTempTable np. ShapeNose z Medium na Big to wszystkie wartości mi wymazuje w tabeli tblDescription w danym rekordzie uzywajac pierwszego sqlka (update). Dlaczego?
Jak to poprawić?

W załączeniu baza danych przykładowa.

Proszę pomóżcie,
Jacek

1

Coś pokręciłeś, czy tam pokręcił Twój kolega ten kod nie ma szans zadziałać bo łączysz 2 tabele po wartościach które dopiero chcesz zmienić (inaczej mówiąc chcesz znaleźć wspólny rekord do zmiany na podstawie danych które dopiero chcesz zmienić )

Musisz wziąć pod uwagę pole Person ... ale tu się pojawiają schody bo w Excelu masz Podane pole Person - np Paul 2 x z różnymi wartościami innych pól - więc jak zmienisz w Excelu wartość nosa z big na medium to update zrobi Ci dla obu rekordów .... w ogóle nie rozumiem założenia że 1 osoba może mieć wiele opisów ?

Tak czy inaczej musisz kombinować z czymś takim:

UPDATE (exceltemptable
        INNER JOIN tblpeople
                ON exceltemptable.person = tblpeople.name)
       INNER JOIN (tbldescription
                   INNER JOIN tbldescriptionpeople
                           ON tbldescription.descriptionid =
                              tbldescriptionpeople.descriptionid)
               ON tblpeople.personid = tbldescriptionpeople.peopleid
SET    tbldescription.eyecolor = [exceltemptable].[eyecolor],
       tbldescription.hairstyle = [exceltemptable].[hairstyle],
       tbldescription.noseshape = [exceltemptable].[noseshape];  
0

BlackRed dzięki. Właśnie zastanawiam się czy w ogóle jest to możliwe.
Może najpierw powininien wywalić wszystko z tabeli tblDescription i dopiero na końcu pokombinować z połączeniem to do odpowiedniej Person.

w ogóle nie rozumiem założenia że 1 osoba może mieć wiele opisów ?

to jest przykład tylko, ale w modelu biznesowym mam właśnie taką sytuację bo tą osobą jest customer i ten customer może mieć wiele różnych kombinacji z tabeliDescription.

Twój sql nie działa.

Dodam jeszcze, że tabela ExcelTableTemp jest tabelą narastającą, ciąglę się zmieniającą. Rekordy mogą zostać wycięte, dodane nowe, mogą być dodane nowe kombinacje.

edit:
Kroki powinny byc takiej wg mnie:

  1. Sprawdź tabalę tblDescription co jest nowe, czego nie ma to dodaj to jako całościowe rekordy, a co jest zbędne i skasuj to.
  2. Po aktualizacji tabeli tblDescription uzyj update'a dla konkretnych osób i dopisz te wiersze do tabeli tbldescriptionpeople ktorych nie ma do danej osoby, skasuj te które sa zbedne jako całosciowe rekordy (nie mam jednego wyrozniajace pola).

Proszę o pomoc w napisaniu sql'a lub moze macie jakieś inne pomysły?
W powyzszy sposob to tak naprawde "czyszcze" i tworze od nowa tbldescriptionpeople oraz tbldescription, nie wiem czy to dobre podejscie...
Jacek

0

Hej,

jest tam kto?

0

W powyzszy sposob to tak naprawde "czyszcze" i tworze od nowa tbldescriptionpeople oraz tbldescription, nie wiem czy to dobre podejscie...

No więc właśnie ... zacznij może od tego co masz na wejściu, co chcesz na wyjściu. Opisz jakoś logikę biznesową - do czego to ma służyć, kto wprowadza dane, a kto i po co je później pobiera etc.
Z Twojego ostatniego postu wynika, że tabela exceltemptable jest podstawą do budowy wszelkich innych tabel ? :| To tak jakby wszystkie dane z tabel usunąć i wypełnić na nowo ? Tylko po co ?

Co do tego kodu nie wiem co tam u ciebie nie działa u mnie działa ;) Tylko że jak masz 2 różne osoby z różnymi danymi w excel - podpięte to tego same description to Ci wychodzi brak logiki w tym całym założeniu.

0

To jest tylko maly przyklad , moj caly model jest olbrzymi a to jest maultka galaź z tego.

Z tabeli excelowej tylko czyscimy jedna tabele - tblDescription oraz uaktualniamy tabele descriptionpeople table.
Tak wyglada, że dane sa dostarczane recznie przez pana, ktory wymysla konfiguracje rozne.

Osobę moze byc customer, moze byc jakas aplikacja.
Do tej aplikacji mogę miec wiele konfiguracji dlatego mamy tutaj wiele do wielu.
Zamiast osoby i description mozesz dac tam studentow i konfiguracje klas lub wykladow albo co chcesz.

Przetestowalem jeszcze razi rzeczywiscie dziala. Ale nie do konca tak jak powinno.

Rozwiazalem to w inny sposob:

  1. Dodaje rekordy ktorych nie mam w tblDescription a mam w ExcelTempTable
    2.Usuwam te rekordy ktorych nie mam w ExcelTempTable a mam w tblDescription
  2. Uruchamiam kwarendy ktore updatują tabele descriptionpeople.

Jacek

0

Dziękuję BlackBed. Swoją drogą jak się nauczyć pisać takie skomplikowane sqlki jak napisałeś ? :)

Jacek

1

Szczerze mówiąc ten krotki update jest bardzo prosty. Wydaje Ci się skomplikowany bo są użyte 4 powiązane ze sobą tabele i tylko tyle.

A uczysz się przez praktykę - tj. masz problem i potrzeby go rozwiązania to zaczynasz szukać i kombinować, czasem jak już staniesz w miejscu to pojawiasz się tu :D czy na innym forum tematycznym.
(co prawda ja mgr mam z ZSRBD ale pracowałem długo bardziej jako analityk biznesowy i key user od systemu ERP także praktycznie wszytsko wyleciało - a z czasem na nowo sie człowiek uczy i przypomina ;) ).
Jak chcesz zgłębiać wiedzę to szukaj różnych stron z zadaniami do testów choćby np.: https://granicekodu.pl/category/tsql/podstawowy-t-sql/
A tu masz ciekawą propozycję gdzie bardzo przystępnym językiem są opisane podstawy: https://www.sqlpedia.pl/kurs-sql/

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