2009-04-20 4 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를 의미합니까? 예 (예 : 50 개 열 중 3 개) –

+0

TEXTn은 쉼표로 구분 된 목록입니까 아니면 단일 지역 번호입니까? –

답변

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 개 이상의 열 (내 디자인이 아닌 거의 완전히 비정규 화되었습니다.)이 중 대부분은 참조 테이블의 열에 조인 될 수있는 값을 포함합니다.

은 Schedule의 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 
    ... 

일하는 것이 그래서, 같은 테이블 디자인을 제공. 당신의 RDBMS가 지원하는 경우 IN를 사용하여 단순화 수 :

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

TheSoftwareJedi에 동의를하지만, 실패 - 투 - 일치 사라 일정 행이 발생하지 않도록 그냥 LEFT 조인을 사용하여 제안 할 수 있습니다 ?

물론 28 개의 JOIN을 수행하는 것은 세부 사항이 조금 복잡 할 것입니다.

내가이 "비정규이"더 "abnormalized"전화 줄 모르겠어요 ... :-)

+0

달라질 수 있습니다. db는 당신이 동일한 테이블에 합류하고 있다는 것을 깨닫고, 그 테이블을 메모리 내 해시로 slurping하는 것이 합리적인 계획임을 깨닫게 될 것입니다. 스키마가 좋지는 않지만 나쁘게 보았습니다. – 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 
.. 

당신은 할 수 있어야한다 전통적인 조인으로 같은 결과를 얻으므로 그렇게 실험해볼 것을 권장합니다.

관련 문제