2009-04-20 19 views
5

"スケジュール"と "参照"の2つのテーブルからデータを取得するビューを作成しようとしています。1つのテーブルの複数の列を別のテーブルの1つの列に結合する

スケジュールには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] 

と参照テーブルは次のように定義されています。私は、各[TEXT1_ ]/[TEXT2_]列に参加しようとしています

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] 

参照として[SCHAREACODE]列にスケジュールを設定します。すべての参照テーブルには、従業員が働くことができるエリアのリストが含まれています。

+0

テーブルの例と使用しているRDBMSの例を質問に反映してください。 MySQL、SQL Serverなど – Seb

+0

スケジュール内のすべての列が参照内の列に結合されますか?つまり、実際に行を意味しますか?例を挙げてください(例:50列のうち3つ)。 –

+0

TEXTnはコンマ区切りのリストですか、1つの市外局番ですか? –

答えて

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以上の列のうちの1つが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 
    ... 

動作します:ような何かが

Schedule (MaybeReferenceId1, MaybeReferenceId2, MaybeReferenceId3, ...) 
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は同じテーブルに参加していることを認識しているので、そのテーブルをメモリ内ハッシュにスラップすることは合理的な計画です。スキーマはきれいではありませんが、私は悪化しています。 – 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 
.. 

次のことができるようにすべきです伝統的な結合で同じ結果が得られるので、私もそれを試してみることをお勧めします。

関連する問題