SQL Zapytanie wyswietlające dwie różne tabele

0

Witam was mam takie pytanie chciał bym wyświetlić tabelę 1 oraz tabelę 2 która jest powiązana z tabelą 1 polem ID. Problem w tym że jeśli zrobimy zwykłego Joina to będzie wyglądało na takiej zasadzie że powieli nam to wszystko tyle razy ile elementów jest w drugie Tabeli. A dokładnie tabela 1 jest to tabela użytkownika a tabela 2 to z elementami tego użytkownika gdy zrobię zwykłego joina to będzie wyglądało tak :

Imie Nazwisko Pesel Miejscowosc Ulica KodPocztowy NazwaElementu KodElementu

Jan Kowalski 123 Kraków adfasd 123-123 salkda 1231313
Jan Kowalski 123 Kraków adfasd 123-123 salkda 1231313
Jan Kowalski 123 Kraków adfasd 123-123 salkda 1231313
Bogdan Kowalski 123 Kraków adfasd 123-123 salkda 1231313
Bogdan Kowalski 123 Kraków adfasd 123-123 salkda 1231313
Bogda Kowalski 123 Kraków adfasd 123-123 salkda 1231313

A czy da się zrobić to na takiej zasadzie że :

Imie Nazwisko Pesel Miejscowosc Ulica KodPocztowy NazwaElementu KodElementu

Jan Kowalski 123 Kraków adfasd 123-123
salkda 1231313
salkda 1231313
salkda 1231313

Bogdan Kowalski 123 Kraków adfasd
salkda 1231313
salkda 1231313
salkda 1231313

Da się coś takiego zrobić z poziomu sql czy będę musiał ingerować kodem z innego poziomu tzn po stronie aplikacji.

0

Nie da się.

0

A coś takiego jak Cube czy Rollup ?

0

Cube i Rollup powodują generowanie podsumowań dla kolejnych zestawów parametrów (rollup) albo dla wszystkich kombinacji parametrów (cube). To znaczy że w twoim przypadku dostałbyś "podsumowania" dla wszystkich janów, potem dla wszystkich janów kowalskich, potem dla janów kowalskich z 123 itd

0

Więc pozostaje chyba tylko zabawa z DataTable i tworzeniu grida na podstawie DataTable

0

od strony sql np cos takiego

create table #data(
  Id int not null identity(1,1),
   ......... tutaj wymagane kolumny
)

pozniej robisz inserta do tej tabeli wynikajacego z inner joina

pozniej update na null


update #data
set pole1 = null,
pole2 = null,

itd, itd

where id not in (select min(Id) from #data group by ........ np Nazwisko + imie)

0

a gdyby zrobił w ten sposób :

  1. Odczytujemy listę osób a dokładnie pobieramy ID_OSÓB
  2. Pętla for od i = 0 to dataset.rows.count
  3. Robimy selecta właśnie z tymi funkcjami cube albo rollup podając w WHERE ID_Osoby
  4. Wynik dopisujemy do Datasetu
  5. Dataset dopisujemy do datagridview1.datasource

I powinniśmy uzyskać to co chce

0

eeeeeeeeeee masakra wydajnosciowa - za duzo odwolan do bazy

0

Wiem :D napisałem to zanim ty odpowiedziałeś na moje pytanie , niestety nie mam jakieś super wiedzy na temat SQL :) i to co ty piszesz to dla mnie czarna magia jak byś mógł mi wytłumaczyć co i jak to było by super

0

tworzysz tabele tymczasowa - czyli taka z # (widoczna w ramach sesji) lub ## (widoczna w ramach polaczenia) np #data lub ##data.
tworzysz ja tak jak kazda inna tabele

robisz insert do tej tabeli wynikajacy z inner joina (bedziesz mial powtorzenia tak jak opisales to w poscie).
teraz pozostaje wyczyscic dane ktore sie powtarzaja (czyli zrobic update tych kolumn na wartosci null).
Zeby to zrobic musisz okreslic ktore wiersze nie moga podlegac null'owaniu - w tym celu musisz miec w tabeli #data pole z identity.
Zeby okreslic wiersze nie podlegajace null'owaniu wyszukujesz min id dla polaczenia np imie, nazwisko (moze cos wiecej? )

0

Nie mam pod ręką żadnego sqla, ale coś takiego

select dane.imie
	,dane.nazwisko
	,dane.pesel
	,dane.miejscowosc
	,dane.ulica
	,dane.kodPocztowy
	,dane.nazwaElementu
	,dane.kodElementu
from
(select 
	imie
	,nazwisko
	,pesel
	,miejscowosc
	,ulica
	,kodPocztowy
	,null as nazwaElementu
	,null as kodElementu
	,id1
	,0 as id2
from tabela1
inner join tabela2
	on tabela2.id2 = tabela1.id1
union all
select 
	null as imie
	,null as nazwisko
	,null as pesel
	,null as miejscowosc
	,null as ulica
	,null as kodPocztowy
	,nazwaElementu
	,kodElementu
	,id1
	,id2
from tabela1
inner join tabela2
	on tabela2.id2 = tabela1.id1) dane
order by dane.id1
	,dane.id2
0

zapomniałem distinct

0

poprawione

select dane.imie
	,dane.nazwisko
	,dane.pesel
	,dane.miejscowosc
	,dane.ulica
	,dane.kodPocztowy
	,dane.nazwaElementu
	,dane.kodElementu
from
(select distinct
	imie
	,nazwisko
	,pesel
	,miejscowosc
	,ulica
	,kodPocztowy
	,null as nazwaElementu
	,null as kodElementu
	,id1
	,0 as id2
from tabela1
inner join tabela2
	on tabela2.tabela1id1 = tabela1.id1
union all
select 
	null as imie
	,null as nazwisko
	,null as pesel
	,null as miejscowosc
	,null as ulica
	,null as kodPocztowy
	,nazwaElementu
	,kodElementu
	,id1
	,tabela2.id2 as id2
from tabela1
inner join tabela2
	on tabela2.tabela1id1 = tabela1.id1) dane
order by dane.id1
	,dane.id2

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