Łączenie tablic dwa razy

0

Mam tablicę tabFaktury, w której między innymi są dwa istotne dla mnie pola utworzyl_id oraz zmodyfikowal_id.
Te dwa pola odwołują się do tej samej tablicy tabUzytkownicy, w której są pola ID oraz nazwa_uzytkownika.
Chciałbym tak złączyć te tablice (tablicę tabUzytkownicy dwa razy złączyć), aby odczytać dla danej faktury kto utworzył i zmodyfikował tą fakturę.

Nie wiem jak takie zapytanie musiałoby wyglądać.

1
select u.id_operatora as operator_tworzacy, z.id_operatora as operator_modyfikujacy from tabFaktury t
left outer join tabUzytkownicy u on t.utworzyl_id = u.id_operatora
left outer join tabUzytkownicy z on t.zmodyfikowal_id = z.id_operatora

to oczywiście złączenie zewnętrzne ale możesz zmienić na inner wg potrzeb.

0

Mam jeszcze pytanie do tego wątku. Co w przypadku, jeżeli chcę za pomocą C# wyciągnąć nazwa_uzytkownika z tablicy 'u' a potem z tablicy 'z'.

Normalnie używam polecenia:

reader.GetString("nazwa_uzytkownika");

a np.

reader.GetString("u.nazwa_uzytkownika");

nie działa. W tym przypadku nie mam kontroli nad tym, którą nazwę użytkownika pobiorę z wyniku zapytania (czy z tablicy 'u' czy z 'z')

0

Po pierwsze primo: z bazy wyciągasz informacje, które są ci niezbędne - NIE używasz *
Po drugie primo: aliasujesz nazwy wyciąganych danych.
I nie masz problemu z opisaną sytuacją

0

No właśnie mam problem z tą sytuacją. W komendach C# jak dodaję alias to funkcja nie chce się wykonać. Muszę wyciągnąć nazwa_uzytkownika z dwóch zjoinowanych (takich samych tablic - jak w pierwszym poście)

0

Podaj zapytanie, jakie przekazujesz do C# (może być kod C#) i daj błąd jaki się pojawia (o ile jest).
DDL uzytych tabel tez by się przydał...

0
Marcin.Miga napisał(a):

Podaj zapytanie, jakie przekazujesz do C# (może być kod C#) i daj błąd jaki się pojawia (o ile jest).
DDL uzytych tabel tez by się przydał...

Proszę bardzo:

 
cmd.CommandText = "USE " + Ogolne.strDBName + "; SELECT A.ID, A.numer_faktury, D.nazwa_kontrahenta, A.miejsce_wystawienia, A.data_wystawienia, A.data_sprzedazy, A.termin_platnosci, A.netto, A.brutto, A.zaplacono, A.wydrukowana, A.dostarczona, A.zablokowana, A.korekta, A.ponaglenie_zaplaty, A.potwierdzenie_platnosci, A.data_utworzenia, B.nazwa_uzytkownika, A.data_modyfikacji, C.nazwa_uzytkownika, A.odbiorca_faktury, A.forma_platnosci, A.numer_konta, A.informacja FROM tabFakturyVatSprzedaz A "+
                                                          "LEFT JOIN tabUzytkownicy B ON A.utworzyl_id = B.ID "+
                                                          "LEFT JOIN tabUzytkownicy C ON A.zmodyfikowal_id = C.ID " +
                                                          "LEFT JOIN tabKontrahenci D ON A.kontrahent_id = D.ID " +
                                                          "WHERE A.data_wystawienia BETWEEN @DateFrom AND @DateTo;";
            cmd.Parameters.AddWithValue("@DateFrom", strOd);
            cmd.Parameters.AddWithValue("@DateTo", strDo);
            
            cmd.Connection = cnn;
            MySqlDataReader reader = cmd.ExecuteReader();

...

while (reader.Read())
            {
                uiID = reader.GetUInt32("ID");
                strNumerFaktury = reader.GetString("numer_faktury");
                strNazwaKontrahenta = reader.GetString("nazwa_kontrahenta");
                strMiejsceWystawienia = reader.GetString("miejsce_wystawienia");
                dtDataWystawienia = reader.GetDateTime("data_wystawienia");
                dtDataSprzedazy = reader.GetDateTime("data_sprzedazy");
                dtTerminPlatnosci = reader.GetDateTime("termin_platnosci");
                strNetto = reader.GetString("netto");
                strBrutto = reader.GetString("brutto");
                strZaplacono = reader.GetString("Zaplacono");
                bWydrukowana = false;
                bDostarczona = false;
                bZablokowana = false;
                bKorekta = false;
                bPonaglenieZaplaty = false;
                bPotwierdzeniePlatnosci = false;
                dtDataUtworzenia = reader.GetDateTime("data_utworzenia");
                strUtworzyl = reader.GetString("B.nazwa_uzytkownika");            //WYWALA BŁĄD: NIE ZNALEZIONO KOLUMNY O TAKIEJ NAZWIE (bez aliasu widzi kolumnę)
                dtDataModyfikacji = reader.GetDateTime("data_modyfikacji");
                strZmodyfikowal = reader.GetString("C.nazwa_uzytkownika");     //WYWALA BŁĄD: NIE ZNALEZIONO KOLUMNY O TAKIEJ NAZWIE (bez aliasu widzi kolumnę ale z tabeli B)
                strOdbiorcaFaktury = reader.GetString("odbiorca_faktury");
                strFormaPlatnosci = reader.GetString("forma_platnosci");
                strNumerKonta = reader.GetString("numer_konta");
                strInformacja = reader.GetString("informacja");

...
0

"Po drugie primo: aliasujesz nazwy wyciąganych danych."
C.nazwa_uzytkownika AS nazwa_uzytkownika_ktory_zmodyfikowal

0

Dalej nie działa screeny poniżej:

a528d1f4a4.png


968cedbde0.png


78ec9b3735.png

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