2016-05-13 26 views
0

需要此查詢的一些幫助。我試圖創建一個查詢選擇所有父母的細節,我有另一個表來附加稱爲家庭。我遇到的問題是Family表包含FamilyListID字段,其中包含通過回車分隔的瞳孔和父母的主鍵。當然,可能會有幾個身份證,因爲學生可能有兄弟姐妹,所以這些都存儲在這個領域。我可以在sql中進行多鍵連接嗎?

有沒有一種方法可以加入多個Pupil.pk_PupilID,Father.pk_PersonID,Mother.pk_PersonID與Family.FamilyListID相關,記住根據情況可能不存在Father.pk_PersonID或Mother.pk_PersonID的學生。希望這是有道理的 - 我知道在家庭和學生之間需要有一個真實的聯結表,但這是我目前必須合作的結構。

SELECT 
    Pupil.pk_PupilID, Pupildata.Title, Pupildata.Forename, 
    Pupildata.Surname, Pupildata.PreferredForename, 
    father.pk_PersonID, father.Title, father.Forename, father.Surname, 
    mother.pk_PersonID, mother.Title, mother.Forename, mother.Surname, 
    Pupil.Form, 
    Address.Address1, Address.Address2, Address.TownCity, Address.Postcode, 
    Address.Country, Address.County 
FROM 
    Pupil 
LEFT JOIN 
    PERSON AS Pupildata ON Pupil.pk_PupilID = Pupildata.pk_PersonID 
LEFT JOIN 
    RELATION AS rfather ON Pupil.pk_PupilID = rfather.fk_PersonID 
LEFT JOIN 
    PERSON AS father ON rfather.fk_RelatedPersonID = father.pk_PersonID 
LEFT JOIN 
    RELATION AS rmother ON Pupil.pk_PupilID = rmother.fk_PersonID 
LEFT JOIN 
    PERSON AS mother ON rmother.fk_RelatedPersonID = mother.pk_PersonID 
LEFT JOIN 
    PERSONADDRESS AS pa ON Pupil.pk_PupilID = pa.fk_PersonID 
LEFT JOIN 
    ADDRESS ON pa.fk_AddressID = Address.pk_AddressID 
WHERE 
    Pupil.pk_PupilID IN ('" & pks & "') 
    AND rfather.Relationship IN ('Father', 'Stepfather') 
    OR rmother.Relationship IN ('Mother', 'Stepmother') 
    AND Address.PrimaryAddress = 1 
ORDER BY 
    Pupildata.Forename ASC 
+0

將它們全部交叉,並移動where子句的約束 - 大多數數據庫將做正確的事情,而不是實際運行交叉連接 –

+0

我不得不說,這實際上聽起來像是數據庫設計的問題。在一個單獨的文本字段中有多個鍵,由回車分隔,完全破壞了數據庫的用途。似乎更好的辦法是建立一個關係表,將個人與所有家庭成員聯繫起來,或者可能只有一個家庭成員關係表。 因此,我會在Person表上放置一個Family ID,而不是在Family表的列上放置多個Person ID。 –

+0

那麼所有的時間結構是一個肯定的輸家,所以我現在就解決它。沒有任何理由將數據存儲在字段中帶回車符的行中,然後想要拉出部分以與其他表進行比較。 – HLGEM

回答

1

你真正的問題是你的數據結構。您需要將所需的數據提取到正確構建的臨時表中,然後執行加入或修復數據模型。這是我使用分割功能做到的。如果您四處搜索拆分功能,則可以使用這些功能。選擇一個最適合您的需求的產品。我必須用|替換CRLF,因爲我的功能只允許單個字符分隔符。

如果您在附近搜索,您可能會發現一個可以讓您使用更長的分隔符的地方。無論如何,這給你一個如何讓數據可用於你可以加入的想法。此代碼是用SQL服務器編寫的。我沒有提供函數代碼,因爲不知道你有什麼後端數據庫很難說什麼會起作用,這更多地指向你需要做什麼的方向。

Create table #test (Familyid int, Detail varchar(100)) 
insert into #test(Familyid, Detail) 
values (1, '1 '+char(13)+char(10)+ '2 ' +char(13)+char(10)+ '3') 
,(2, '4 '+char(13)+char(10)+ '5 ' +char(13)+char(10)+ '6') 
,(3, '7 '+char(13)+char(10)+ '8 ') 
select * from #test 

update #test 
set detail = replace (detail, char(13)+char(10), '|') 


select t.familyid, cast(splitdata as Int) as ID 
into #test2 
from #test t 
cross apply dbo.fn_Split_String (detail, '|') 

select * from #test2 

現在真正的問題,雖然是你的表變得越來越大,這將是污垢緩慢,因爲你必須將整個表每次運行查詢時轉換。這就是爲什麼這個結構是一個失敗者,你需要解決這個問題。

如果您無法替換此表格,請參閱是否可以創建另一個設計正確的表格,使用您選擇的拆分功能並填充它,然後在原始平板電腦上使用觸發器填充它,以更新,刪除或者在原始表中更改記錄時插入到第二個表中。這是一個折中的解決方案,但至少您只需在數據發生更改時(而不是每次運行查詢時)在記錄上進行拆分。

相關問題