2015-08-28 55 views
0

我有一張名爲BankHoliday的表,其中包含一個Date字段以及Id字段..目前包含今年和明年的Bank Holidays的所有日期。SQL Server - Insert with multiple sub queries(3 tables)

我也有一個表叫員工含有StaffIDStaffNameActive

現在使用SQL我試圖寫一個INSERT語句到表名爲Calendar在這些銀行假日日期插入。此表包含CalendarDateCalendarIDStaffID

StaffID是我的問題是...

問題

我怎麼可以在SQL Server寫的INSERT語句在那裏將獲取一個Active工作人員名單隨同每個銀行假日Date,然後INSERT他們到Calendar表?

示例數據將返回:

CalendarID CalendarDate StaffID 
    1  31/08/2015  1 
    2  31/08/2015  2 
    3  31/08/2015  3 
    4  31/08/2015  4 
    5  31/08/2015  5 
    6  25/12/2015  1 
    7  25/12/2015  2 
    8  25/12/2015  3 
    9  25/12/2015  4 
    10  25/12/2015  5 

因此,爲了闡明上述CalendarDate將包含當前不在該表中BankHoliday Date s的列表(WHERE NOT EXISITS

StaffID被檢索來自Staff表,其中列表僅包含Active成員

enter image description here

回答

3

我認爲您正在尋找CROSS JOIN。

INSERT INTO Calendar 
SELECT b.CalendarDate, s.StaffID FROM BankHoliday b 
CROSS JOIN Staff s 
WHERE s.Active = 1 

這將讓一排每家銀行假期,每個活動的工作人員。

+0

我的幫助 – Crezzer7

+0

完善三江源現在試試這個,三江源,我將考慮交叉連接,從未在此之前使用,但看起來非常有用 – Crezzer7

+1

交叉連接是非常罕見使用,但在這種情況下效果很好! – StoicFnord

1

Ther已經被接受了,所以我遲到了 - 沒關係。只是一個暗示:我想你可以提高設計:

  1. 你應該創建一個日期表不僅爲銀行假日,但 運行的所有日期的列表。這些日期可以標記爲 「IsBankHoliday」。這樣的日期列表在很多情況下非常有用。
  2. 我不知道你打算怎麼做,但通常你 不會寫入數據到物理表,你可以容易地檢索到 。所以 - 可能! - 這不是最好的主意......

只是我的解決方案,顯示錶的連接。事實上,這不是別的,那麼CROSS JOIN的另一種解決方案...Person4不活躍,因此丟失:

declare @bankholidays TABLE(ID INT,TheDate DATE); 
insert into @bankholidays values(1,{ts'2015-08-31 00:00:00'}),(2,{ts'2015-12-25 00:00:00'}); 

declare @staff TABLE(StaffID INT,StaffName VARCHAR(100could),Active BIT); 
insert into @staff VALUES(1,'Person1',1),(2,'Person2',1),(3,'Person3',1),(4,'Person4',0),(5,'Person5',1); 

declare @target TABLE(targetID INT,CalendarID INT,CalendarDate DATE,StaffID INT); 

INSERT INTO @target 
SELECT ROW_NUMBER() OVER(ORDER BY bh.TheDate,s.StaffID) 
     ,bh.ID 
     ,bh.TheDate 
     ,s.StaffID 
FROM @staff AS s,@bankholidays AS bh 
WHERE s.Active=1; 

SELECT * FROM @target 
+0

謝謝你的建議,它更有意義地把所有內容存儲在一張表中,我可能會這樣做,所以謝謝你的建議 – Crezzer7