2009-04-20 7 views
5

Я ищу, чтобы создать представление, которое извлекает данные из двух таблиц «Расписание» и «Ссылка».Объединение нескольких столбцов в одной таблице в один столбец в другой таблице

Расписание имеет более 50 столбцов (это почти полностью денормализованный, а не мой дизайн), большинство из которых содержат значение, которое может быть соединено с столбцом в справочной таблице.

Как написать инструкцию SQL для правильного объединения каждого столбца в расписаниях в один столбец в ссылке?

Таблица Расписание определяется как:

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] 

И Справочная таблица определяется как:

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] 

Я пытаюсь присоединиться к каждому [TEXT1_ ]/[TEXT2_] столбец Запланируйте столбец [SCHAREACODE] в ссылке. Вся справочная таблица содержит список областей, в которых сотрудник мог работать.

+0

Пожалуйста, обновите свой вопрос на примере ваших таблиц и каких RDBMS вы используете - например. MySQL, SQL Server и т. Д. – Seb

+0

Включает ли каждый столбец в Schedules в COLUMN в ссылке - или вы действительно имеете в виду ROW? Просьба привести пример (например, 3 из 50 столбцов.) –

+0

Является ли ТЕКСТ списком с разделителями-запятыми или только одним региональным кодом? –

ответ

0

От обновленного вопроса

Возможно, что-то вроде этого? Это будет беспорядочно, независимо от того, что вы делаете.

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

Я подозреваю, что это может быть единственный способ. –

6

Я думаю, что он имел в виду, чтобы присоединиться на несколько раз Справочная таблица:

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

Что делать, если я хочу выбрать несколько столбцов из справочной таблицы? Было бы так: «Выберите R1.ID, R2.ID, R3.ID, R4.ID .......» – nakul

1

Ваше описание немного не хватает, так что я буду считать, что

Расписание имеет 50+ столбцов (это почти полностью денормализованный - не мой дизайн), большинство из которых содержат значение, которое может быть соединено с столбцом в таблице Reference.

означает, что 1 из 50+ столбцов в расписании является ReferenceId. Таким образом, учитывая дизайн таблицы, как:

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

Что-то вроде:

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 
    ... 

будет работать. Вы могли бы упростить ее с помощью IN если ваша РСУБД поддерживает его:

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

Принимаю с TheSoftwareJedi, но я могу только предложить использовать ЛЕВАЯ JOIN и так, что неудачи-к-игре не вызывают ваш Schedule ряд исчезнуть ?

Конечно, выполнение 28 JOINs будет немного громоздким, какими бы ни были детали.

Я не уверен, что я бы назвал это «денормализованной», более «abnormalized» ... :-)

+0

Я полагаю, это зависит от того, db понимает, что вы присоединяетесь к одной и той же таблице, тогда он может понять, что разделение этой таблицы на хэш-память в памяти - разумный план. Схема некрасивая, но я видел хуже. – araqnid

0

Попробуйте запрос так:

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 
.. 

Вы должны быть в состоянии получить те же результаты с традиционными объединениями, поэтому я рекомендую вам поэкспериментировать с этим.