2014-05-19 89 views
0

請考慮以下幾點:SQL服務器自參照查詢

CREATE DATABASE TEST 
USE TEST 

CREATE TABLE Student 
    (
     StudentID INT IDENTITY 
        PRIMARY KEY , 
     FirstName NVARCHAR(50) , 
     LastName NVARCHAR(50) 
    ) 

CREATE TABLE StudentComponent 
    (
     StudentComponentID INT IDENTITY 
          PRIMARY KEY , 
     StudentID INT FOREIGN KEY REFERENCES dbo.Student(StudentID) , 
     ComponentName NVARCHAR(50) , 
     ComponentRef NVARCHAR(50) , 
     ComponentType NCHAR(2) 
    ) 

CREATE TABLE Component 
    (
     ComponentID INT IDENTITY 
         PRIMARY KEY , 
     StudentComponentID INT FOREIGN KEY REFERENCES dbo.StudentComponent(StudentComponentID) , 
     ComponentName NVARCHAR(50) , 
     ComponentRef NVARCHAR(50) , 
     ComponentType NCHAR(2) 
    ) 

我有3個表

  1. 學生
  2. StudentComponent
  3. 組件

拆分爲三個維度

CREATE TABLE DimClass 
    (ClassDwKey INT, 
    ClassName NVARCHAR(50), 
    ClassRef NVARCHAR(50)) 

    CREATE TABLE DimCollege 
    (CollegeDwKey INT, 
    CollegeName NVARCHAR(50), 
    CollegeRef NVARCHAR(50)) 

    CREATE TABLE DimSubject 
    (SubjectDwKey INT, 
    SubjectName NVARCHAR(50), 
    SubjectRef NVARCHAR(50)) 

    CREATE TABLE DimStudent 
    (StudentDwKey INT, 
    StudentName NVARCHAR(50)) 

    INSERT INTO 

    CREATE TABLE FactAcademicEvent 
    (StudentDwKey int, ClassDwKey int, CollegeDwKey int, SubjectDwKey INT) 

它們之間的關係相同(學生 - >學生組件 - >組件)。我已經將組件分成了它們自己的維度,DimClass,DimCollege,DimSubject(由componenttype字段拆分,='CL'爲類,'SU'爲主題,'CO'爲大學等我試圖加載一個事實表從我的維度獲得我的代理鍵並生成以下行:

StudentDwKey(來自dimstudent),ClassDwKey,CollegeDwKey,SubjectDwKey。維與組件表之間存在關聯,ComponentKey通過學生組件錶鏈接到學生。

StudentComponent和組件基本上是相同的,除了StudentComponent引用學生,讓有更多的行。

任何想法?

+0

所以組件名稱和ref等於類名,classref,collegename,collegeref等 – jhowe

回答

1

編輯:

完全改變基於OP的編輯和評論。

SELECT 
    s.StudentID, 
    MAX(dim_s.StudentDwKey) AS StudentDwKey, 
    MAX(dim_cl.ClassDwKey ) AS ClassDwKey, 
    MAX(dim_su.SubjectDwKey) AS SubjectDwKey, 
    MAX(dim_co.CollegeDwKey) AS CollegeDwKey 
FROM 
    Student   AS s 
LEFT JOIN 
    StudentComponent AS sc 
    ON sc.StudentID = s.StudentID 
LEFT JOIN 
    dimStudent   AS dim_s 
    ON dim_s.StudentName = s.StudentName -- or whatever is a reliable join 
LEFT JOIN 
    dimClass   AS dim_cl 
    ON dim_cl.ClassRef = sc.ComponentRef 
    AND sc.ComponentType = 'CL' 
LEFT JOIN 
    dimSubject   AS dim_su 
    ON dim_su.SubjectRef = sc.ComponentRef 
    AND su.ComponentType = 'SU' 
LEFT JOIN 
    dimCollege   AS dim_co 
    ON dim_co.CollegeRef = sc.ComponentRef 
    AND sc.ComponentType = 'CO' 
GROUP BY 
    s.StudentID 
+0

不大,所以我有學生和組件拆分爲三個維度所以它會像選擇StudentDwKey,ClassDwKey, CollegeDwKey,DimStudent的SubjectDwKey JOIN DimClass,DimCollege,DimSubject。 Dim表之間沒有關係,因爲它們是通過componenttype從組件(在同一個表中)中分離出來的。所以學生和維度表之間沒有關係,這種關係是通過學生組件的... – jhowe

+0

@jhowe - 我想你將不得不舉出一些示例數據和你想要的結果。也許可以使用www.sqlfiddle.com來使它真的很清楚? – MatBailie

+0

嗨,這將需要我很長時間來創建示例數據等,讓我看看我是否可以使其更清楚。如果沒有,我會去sql小提琴。謝謝你的幫助。 – jhowe

1

請學生表中的學生的詳細信息(您已完成)和組件的詳細信息在組件表(你沒有這樣做),並使用StudentComponent表將它們連接在一起。事情是這樣的:

CREATE DATABASE TEST 
USE TEST 

CREATE TABLE Student 
    (
     StudentID INT IDENTITY 
        PRIMARY KEY , 
     FirstName NVARCHAR(50) , 
     LastName NVARCHAR(50) 
    ) 

CREATE TABLE StudentComponent 
    (
     StudentComponentID INT IDENTITY 
          PRIMARY KEY , 
     StudentID INT FOREIGN KEY REFERENCES dbo.Student(StudentID) , 
     ComponentID INT FOREIGN KEY REFERENCES dbo.Component(ComponentID), 
    ) 

CREATE TABLE Component 
    (
     ComponentID INT IDENTITY 
         PRIMARY KEY , 
     ComponentName NVARCHAR(50) , 
     ComponentRef NVARCHAR(50) , 
     ComponentType NCHAR(2) 
    ) 
+0

嗨,這些不是來自系統的源表。我從這些數據中提取數據,分解成維度並嘗試插入事實表。 – jhowe