我正在使用Microsoft SQL Server 2014.從2個外鍵生成所有可能的組合
假設我有一個有3個表的大學數據庫。一個列出課程,一個課程,以及一門課程。
CREATE TABLE Courses (
Course_ID varchar(5) PRIMARY KEY NOT NULL,
Name varchar(255) NOT NULL
)
CREATE TABLE Years (
Year_ID tinyint
)
CREATE TABLE Coursework (
CW_ID varchar(5) PRIMARY KEY NOT NULL,
Name varchar(255) NOT NULL,
Allowed varchar(255) NOT NULL
)
現在,一門課程可能被允許任何課程/年組合。所以,我可以開設一門課程,讓X專業的一年級學生專門學習,另一門課程允許學生參加2年級和3年級的X,Y和Z課程,其中一門課程允許所有年級的課程X的學生,一門允許學生在第一年和第二年無論如何,甚至是允許所有課程和所有年份的課程。 (我希望這能讓我的觀點得以實現。)
「允許」將通過引用每個表(課程和年)的外鍵來驗證組合是否有效。
但我該怎麼做?我想過使用複合主鍵創建一個新表,但這需要手動輸入,並且它將被限制在成對的組合中。
所以我的猜測是我需要以某種方式生成可能的組合,將它們列在一個表中,每個主鍵都有一個唯一的主鍵,並將其作爲「課程作業」表中的外鍵引用。但是,我有點卡住了。有小費嗎?
編輯:
爲了澄清我想:
想象一下以下的課程表:
Course_ID Name
A Arithmetics
B Biology
C Chemistry
而且隨後的幾年表:
Year_ID
1
2
3
而現在,一個老師創建一門新課程。他們希望在2或3年級的時候向學生提供,學習生物學或化學。因此,第3年有人會學習生物學,第2年學習化學,但不適合第1年學習生物學的人或第2年學習算術的人。
他們會將課程作業插入表中。
CW_ID Name Allowed
SA Soil analysis B,C,2,3
這將是罰款,但我怎麼會檢查它們正在進入存在的價值,進入「X 5」,例如阻止他們,因爲這些當然/年不存在?
EDIT2:
我測試的東西,但除了它絕對不是最好的解決辦法,我什至不知道如何實現它。
CREATE TABLE YesOrNo (
YesOrNo_ID bit PRIMARY KEY NOT NULL
)
CREATE TABLE Allowed (
Allowed_ID int IDENTITY(1,1),
Arithmetics bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
Biology bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
Chemistry bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
First bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
Second bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL,
Third bit FOREIGN KEY REFERENCES YesOrNo(YesOrNo_ID) NOT NULL
)
通過與所有的課程/年的1和0(true或false)的所有組合填充允許表中,老師將只需要插入Allowed_ID在習作表,那麼這將是已知哪門課程/年課程被允許。
但是,手動添加所有課程和年份作爲屬性是不切實際的,即使如此,我也不知道如何自動填充所有可能性。
從例如以中,表中的行之一是這樣的:
Allowed_ID Arithmetics Biology Chemistry First Second Third
42 0 1 1 0 1 1
而且老師剛輸入「42」到在習作表允許的領域。
我竭力要了解你們什麼在這裏實現。如果你想要的是基於來自不同表格的鍵值的所有可能組合的列表,那麼你可以用'CROSS JOIN'來做到這一點。 – mheptinstall
爲什麼你想實現這個?即使在每個表格中有少量的行,這些組合的數量也是驚人的。你真正想在這裏做什麼,我們可以幫助你找到更好的方法。 –
爲什麼你之前沒問過谷歌? http://stackoverflow.com/questions/18716767/return-all-possible-combinations-of-values-in-columns-in-sql –