2009-04-20 15 views
5

Szukam utworzyć widok, który ściąga dane z dwóch tabel "Harmonogram" i "Referencja".Łączenie wielu kolumn w jednej tabeli z jedną kolumną w innej tabeli

Harmonogram zawiera ponad 50 kolumn (jest prawie całkowicie zdenormalizowany - nie mój projekt), z których większość zawiera wartość, która może zostać dołączona do kolumny w tabeli Odniesienia.

Jak napisać instrukcję SQL, aby poprawnie dołączyć każdą kolumnę w Zestawieniach do pojedynczej kolumny w Odwołaniu?

Tabela Harmonogram jest zdefiniowany jako:

CREATE TABLE [dbo].[Schedule](
    [ID] [int] NOT NULL, 
    [SCHEDULEWEEK] [datetime] NOT NULL, 
    [EMPNO] [numeric](10, 0) NOT NULL, 
    [EMPLNAME] [varchar](32) NULL, 
    [EMPFNAME] [varchar](32) NULL, 
    [EMPSENDATE] [datetime] NULL, 
    [EMPHIREDATE] [datetime] NULL, 
    [EMPTYPE] [char](1) NULL, 
    [EMPSTATUS] [char](1) NULL, 
    [SNREFUSALS] [tinyint] NULL, 
    [QUALSTRING] [varchar](128) NULL, 
    [JOBOVERSHIFTTYPE] [bit] NULL, 
    [SHORTNOTICE] [bit] NULL, 
    [SHORTNOTICEWAP] [bit] NULL, 
    [SHORTNOTICEPHONE] [varchar](32) NULL, 
    [LEADHAND] [bit] NULL, 
    [DUALCURRENCY] [bit] NULL, 
    [MIN100WINDOW] [bit] NULL, 
    [STATHOLIDAY] [bit] NULL, 
    [AREAOVERHOURS] [bit] NULL, 
    [DOUBLEINTERZONES] [bit] NULL, 
    [MAXDAYSPERWEEK] [tinyint] NULL, 
    [MAXHOURSPERWEEK] [numeric](10, 2) NULL, 
    [MAXHOURSPERSHIFT] [numeric](10, 2) NULL, 
    [MAXDOUBLESPERWEEK] [tinyint] NULL, 
    [ASSIGNEDDAYS] [tinyint] NULL, 
    [ASSIGNEDHOURS] [numeric](10, 2) NULL, 
    [ASSIGNEDDOUBLES] [tinyint] NULL, 
    [ASSIGNEDLOAHOURS] [numeric](10, 2) NULL, 
    [SHIFTNO1] [int] NULL, 
    [TEXT1_1] [varchar](64) NULL, 
    [TEXT2_1] [varchar](64) NULL, 
    [DAYFLAG1] [bit] NULL, 
    [COMMENT1] [text] NULL, 
    [SHIFTNO2] [int] NULL, 
    [TEXT1_2] [varchar](64) NULL, 
    [TEXT2_2] [varchar](64) NULL, 
    [DAYFLAG2] [bit] NULL, 
    [COMMENT2] [text] NULL, 
    [SHIFTNO3] [int] NULL, 
    [TEXT1_3] [varchar](64) NULL, 
    [TEXT2_3] [varchar](64) NULL, 
    [DAYFLAG3] [bit] NULL, 
    [COMMENT3] [text] NULL, 
    [SHIFTNO4] [int] NULL, 
    [TEXT1_4] [varchar](64) NULL, 
    [TEXT2_4] [varchar](64) NULL, 
    [DAYFLAG4] [bit] NULL, 
    [COMMENT4] [text] NULL, 
    [SHIFTNO5] [int] NULL, 
    [TEXT1_5] [varchar](64) NULL, 
    [TEXT2_5] [varchar](64) NULL, 
    [DAYFLAG5] [bit] NULL, 
    [COMMENT5] [text] NULL, 
    [SHIFTNO6] [int] NULL, 
    [TEXT1_6] [varchar](64) NULL, 
    [TEXT2_6] [varchar](64) NULL, 
    [DAYFLAG6] [bit] NULL, 
    [COMMENT6] [text] NULL 
-- Snip 
) ON [PRIMARY] 

i tabela odniesienia jest definiowany jako:

CREATE TABLE [dbo].[Reference](
    [ID] [int] NOT NULL, 
    [CODE] [varchar](21) NOT NULL, 
    [LOCATIONCODE] [varchar](4) NOT NULL, 
    [SCHAREACODE] [varchar](16) NOT NULL, 
    [LOCATIONNAME] [varchar](32) NOT NULL, 
    [FLTAREACODE] [varchar](16) NOT NULL 
) ON [PRIMARY] 

Staram się przyłączyć każdy [TEXT1_ ]/[TEXT2_] kolumnę Zaplanuj w kolumnie [SCHAREACODE] w odnośniku. Cała tabela zawiera listę obszarów, w których pracownik może pracować.

+0

Zaktualizuj pytanie, podając przykład swoich tabel i używanego systemu RDBMS - np. MySQL, SQL Server, itp. – Seb

+0

Czy każda kolumna w Zestawieniach łączy się z KOLUMIĄ w referencji - czy faktycznie oznacza ROW? Podaj przykład (np. 3 z 50 kolumn). –

+0

Czy TEXT to lista rozdzielana przecinkami, czy tylko pojedynczy numer kierunkowy? –

Odpowiedz

0

Ze zaktualizowanego pytania

Być może coś takiego? To będzie nieładne, bez względu na to, co zrobisz.

SELECT S.ID 
    S.TEXT1_1, 
    TEXT1_1_RID = COALESCE((SELECT MAX(R.ID) FROM Reference R WHERE R.SCHAREACODE = S.TEXT1_1), 0), 
    S.TEXT1_2, 
    TEXT1_2_RID = COALESCE((SELECT MAX(R.ID) FROM Reference R WHERE R.SCHAREACODE = S.TEXT1_2), 0), 
    ... 
FROM Schedule S 
+0

Podejrzewam, że to może być jedyny sposób. –

6

myślę Oznacza on dołączyć na stole wiele razy referencyjny:

SELECT * 
    FROM Schedule AS S 
INNER JOIN Reference AS R1 
     ON R1.ID = S.FirstID 
INNER JOIN Reference AS R2 
     ON R2.ID = S.SecondID 
INNER JOIN Reference AS R3 
     ON R3.ID = S.ThirdID 
INNER JOIN Reference AS R4 
     ON R4.ID = S.ForthID 
+0

Co się stanie, jeśli chcę wybrać kilka kolumn z tabeli referencyjnej? Czy będzie to "Wybierz R1.ID, R2.ID, R3.ID, R4.ID ......." – nakul

1

Twój opis jest nieco brakuje, więc mam zamiar założyć, że

Harmonogram ma 50+ kolumn (jest prawie całkowicie zdenormalizowanych - nie mój projekt), z których większość zawiera wartość, która może być dołączona do kolumny w tabeli Odniesienia.

oznacza, że ​​1 z 50 + kolumn w Harmonogram jest ReferenceId. Tak więc, biorąc pod uwagę konstrukcję stołu jak:

Schedule (MaybeReferenceId1, MaybeReferenceId2, MaybeReferenceId3, ...) 
Reference (ReferenceId) 

coś takiego:

SELECT * 
FROM Schedule 
JOIN Reference ON 
    Schedule.MaybeReferenceId1 = Reference.ReferenceId 
    OR Schedule.MaybeReferenceId2 = Reference.ReferenceId 
    OR Schedule.MaybeReferenceId3 = Reference.ReferenceId 
    OR Schedule.MaybeReferenceId4 = Reference.ReferenceId 
    ... 

będzie działać. Można uprościć go za pomocą IN jeśli RDBMS obsługuje go:

SELECT * 
FROM Schedule 
JOIN Reference ON 
    Reference.ReferenceId IN (
     Schedule.MaybeReferenceId1, 
     Schedule.MaybeReferenceId2, 
     Schedule.MaybeReferenceId3, 
     Schedule.MaybeReferenceId4, 
     ... 
    ) 
0

zgodzić się z TheSoftwareJedi, ale mogę tylko sugerować przy użyciu LEFT JOIN tak że awarie-to-match nie powodują harmonogram wiersz zniknąć ?

Oczywiście wykonanie 28 JOINów będzie nieco uciążliwe, niezależnie od szczegółów.

nie jestem pewien Nazwałbym to "nieznormalizowane", bardziej "abnormalized" ... :-)

+0

Przypuszczam, że to zależy: db zdaje sobie sprawę, że przyłączysz się do tego samego stołu, może wtedy zdać sobie sprawę, że slurping tego stołu w haszowanie w pamięci jest rozsądnym planem. Schemat nie jest ładny, ale widziałem gorzej. – araqnid

0

Spróbuj zapytać tak:

select s.*, r.schareacode from schedule s, 
where 
s.text1_1 = s.schareacode 
or s.text2_1 = s.schareacode 
or s.textx_x = s.schareacode 
.. 

powinien być w stanie uzyskać takie same wyniki w przypadku tradycyjnych połączeń, więc polecam również eksperymentowanie z tym.

Powiązane problemy