Dwa klucze obce z jednej tabeli

Odpowiedz Nowy wątek
2015-10-28 22:10
0

W uproszczeniu są trzy tabele, Serials (główna), Users i Devices:

Serials:
ID: INTEGER
Serial: VARCHAR(20)
DeviceType: INTEGER (klucz obcy Devices.ID)
CreatedBy: INTEGER (klucz obcy Users.ID)
ModifiedBy: INTEGER (klucz obcy Users.ID)

Users:
ID: INTEGER
FirstName: VARCHAR(50)
LastName: VARCHAR(50)

Devices:
ID: INTEGER
DeviceName: VARCHAR(20)

Jakie powinno być zapytanie do bazy, aby przedstawić całą główną tabelę Serials, w której klucze obce zostaną zastąpione nazwami z tabel Users i Devices, czyli wynikowa tabela będzie miała kolumny np. takie:

gdzie

Serial: pochodzi oczywiście z tabeli Serials

DeviceName: nazwa urządzenia z tabeli Devices.DeviceName określona na podstawie klucza Serials.DeviceType

CreatedByFirstName: imię użytkownika z tabeli Users.FirstName określone na podstawie klucza Serials.CreatedBy

CreatedByLastName: nazwisko użytkownika z tabeli Users.LastName określone na podstawie klucza Serials.CreatedBy

ModifiedByFirstName: imię użytkownika z tabeli Users.FirstName określone na podstawie klucza Serials.ModifiedBy

ModifiedByLastName: nazwisko użytkownika z tabeli Users.LastName określone na podstawie klucza Serials.ModifiedBy

Jak można zauważyć, w tabeli Serials występują dwie kolumny CreatedBy i ModifiedBy z kluczami obcymi powiązanymi z ID z jednej tabeli, czyli Users. Wartości tych kluczy mogą być różne w jednym rekordzie i dlatego nie wiem, jak skonstruować zapytanie, aby uzyskać oczekiwaną tabelę.

Proszę o pomoc :)

Pozostało 580 znaków

2015-10-28 22:30

Chyba o to chodzi, (pisane na sucho, także lieterówk itp mogą być, ale schemat zapytania powinien być OK)

SELECT
    S.id As ID,
    S.Serial AS Serial,
    D.DeviceName AS Device,
    UC.FirstName AS CreatedByFirstName,
    UC.LastName AS CreatedByLastName,
    UM.FirstName AS ModifiedByByFirstName,
    UM.LastName AS ModifiedByByLastName
FROM
    Serials S JOIN
    Devices D ON S.DeviceType = D.Id JOIN
    User UC ON UC.Id = S.CreatedBy JOIN --CreatedBy połączenie użytkownika tworzącego wpis
    User UM ON UM.Id = S.ModifiedBy --ModifiedBy połączenie użytkownika modyfikującego rekord
zamiast USER -> Users, tak to literówek więcej nie widzę. :) - CeKa 2015-10-28 23:25

Pozostało 580 znaków

2015-10-29 10:27
0

@michta, po drobnej korekcji literówek działa elegancko, dzięki !!!!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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