Jak utworzyć widok z takiej struktury tabel?

0

Witam,
mam problem ze skonstruowaniem widoku. Tu proszę fragment bazy
user image
To co chcę osiągnąć to informacje dot. całej firmy czyli w widoku mają się znaleźć wszystkie notatki z projektu, obszaru i firmy dotyczące samej firmy (tak jak idzie relacja) Na razie nabazgrałem coś takiego ale nie działa prawidłowo

CREATE  OR REPLACE VIEW `ansee`.`notatki firmowe` AS 
SELECT `n`.* ,`f`.`nazwa` as `fnazwa` , `o`.`nazwa` as `onazwa` ,`i`.`Nazwa` as `inazwa`
FROM  `ansee`.`firmy` as `f` INNER JOIN (`ansee`.`inwestycja` as `i`,`ansee`.`obszary` as `o`, `ansee`.`notatki` as `n`)
ON (`f`.`idFirmy`=`i`.`Firmy_idFirmy`AND `i`.`idInwestycja`=`o`.`inwestycja_idInwestycja`AND `n`.`Firmy_idFirmy`= `f`.`idFirmy`)  

Nie bardzo się znam na tym wszystkim. I nie wiem czy trzeba by tu zastosować inne złączenie?

1
create view `Widok` as 
select `costam` as `cos1` from `tablicaA` `A` 
inner join `tablicaB` `B` on (`A`.`pole1` = `B`.`pole1` and `A`.`pole2` = `B`.`pole2` and itd.)
inner join `tablicaC` `C` on (`A`.`pole1` = `C`.`pole1` and `A`.`pole2` = `C`.`pole2` and itd.)

Kod pisany z ręki, ale mniej więcej tak to powinno wyglądać.

0

No to jest tylko inny zapis tego samego chyba. Mi jednak chodzi o to żeby na postawie tabeli utworzonej ze złączenia tych trzech tabel (moim czy twoim zapytaniem) dołączyć wiadomości jednak tak żeby się nie powtarzały. W zasadzie w tabeli wynikowej istotna jest tylko firma i treść notatki.

0
cooleq napisał(a)

(...)W zasadzie w tabeli wynikowej istotna jest tylko firma i treść notatki.

Eh może to przez to że kawy jeszcze dzisiaj nie piłem i średnie jarzenie mam, ale skoro tak to dlaczego nie zrobisz po prostu łączenia firmy <-> notatki jeden do jeden?

0

Ponieważ nie każda notatka posiada dowiązanie do firmy. Owszem można to rozwiązać po prostu uzupełniając IDfirmy w tabeli notatki ale w OOo jakoś nie mogę tego zrobić...

1

Hmm, ale w takim razie dla notatek które nie posiadają dowiązanej firmy, pole IDfirmy będzie po prostu puste, tylko zamiast "inner join" użyj "left join".

0

A może zrobić to tak, żeby było czytelniej.
Zrobić widok tak jak wyżej, złączenie tych trzech tabel(włacznie z ID). Następnie

SELECT DISTINCT ... FROM `widok1` LEFT JOIN `notatki` ON (`notatki`.`IdFirmy`=`widok1`.`IdFirmy`,`notatki`.`IdInwestycja`=`widok`.`IdInwestycja`)

Tylko czy to będzie działać jeśli nie będzie gdzieś dowiązania? Chyba że nie ma sensu tego rozbijać na dwa widoki w takim razie do tamtego kodu dopisać

    *

CREATE VIEW `Widok` AS 
SELECT `costam` AS `cos1` FROM `tablicaA` `A` 
INNER JOIN `tablicaB` `B` ON (`A`.`pole1` = `B`.`pole1` AND `A`.`pole2` = `B`.`pole2` AND itd.)
INNER JOIN `tablicaC` `C` ON (`A`.`pole1` = `C`.`pole1` AND `A`.`pole2` = `C`.`pole2` AND itd.)
LEFT JOIN `notatki` as `N` ON( `N`.`pole1` = `C`.`pole1` AND `N`.`pole2` = `C`.`pole2` AND itd.)

Pytam bo nie mam możliwości tego przetestować w tej chwili a bardzo chciałbym to skończyć w tym tygodniu.

1

IMO oba rozwiązania są poprawne (osobny widok albo wszystko w jednym) - zależy czy jeszcze do czegoś będziesz taki widok wykorzystywał. Jeżeli tak to ma sens zrobienie osobnego widoku. No i trzeba pamiętać, że kolejność JOIN'ów ma znaczenie pod względem wydajności, czyli lepiej jako pierwsze łączenia wykorzystać te które najszybciej/najbardziej ograniczą wynik.
Co do "DISTINCT" w zapytaniu - to jest powolne wyrażenie (co nie znaczy, że niepoprawne), w związku z tym próbowałbym tak napisać taki widok, żeby wyniki się nie powtarzały bez zastosowania "DISTINCT" - ale to zależy w dużym stopniu od struktury Twojej bazy...

EDIT: Jeżeli gdzieś nie ma dowiązania przy stosowaniu "LEFT JOIN" to zapytanie dalej działa - komórki z tabeli dowiązanej będą miały wartość NULL.

0

No więc udało mi się chyba zrobić to w dwóch widokach.
Najpierw złączenie firm z inwestycjami

CREATE VIEW `ansee`.`firmy(zlaczenie)` AS
SELECT `f`.`nazwa` as `fnazwa`, f.idFirmy as fid   ,`i`.`Nazwa` as `inazwa`, i.idInwestycja as iid, `o`.`nazwa` as `onazwa`, o.idObszary as oid
FROM  `ansee`.`firmy` as `f` LEFT JOIN (`ansee`.`inwestycja` as `i`,`ansee`.`obszary` as `o`)
ON (`f`.`idFirmy`=`i`.`Firmy_idFirmy`
AND `i`.`idInwestycja`=`o`.`inwestycja_idInwestycja`)  

Następnie dodanie do tego notatek. Wiem, że można to zrobić w jednym ale przyda mi się tamten widok osobno.

 CREATE VIEW `ansee`.`wnotatki` AS
SELECT DISTINCT f.fnazwa, f.fid ,f.inazwa, f.iid , n.*

FROM ansee.`firmy(zlaczenie)` as f LEFT JOIN ansee.notatki as n ON 
( f.fid = n.`Firmy_idFirmy` OR f.iid = n.inwestycja_idInwestycja)

Niestety, nie mogę dodać żadnych danych, przez co całkowicie traci użyteczność. W OO ładnie pobiera i wyświetla dane ale wszystkie przyciski nawigacji są nieaktywne.
Jak próbowałem dodać ręcznie

USE ansee;
INSERT INTO wnotatki (`data`,tresc,Firmy_idFirmy,Pracownicy_idPracownicy) VALUES (20101223,test,0,0) 

Nie było błędów ale "0 row affected"
Wiem, że są jakieś problemy z dodawaniem do widoków, ale nie wiele mogę znaleźć na ten temat.

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