2016-10-01 70 views
0

我需要SQL語句以用於SQL Azure。來自多個表的SQL插入和整數列表

我有2個表的數據:

  • Tenants(相關列:Id)的
  • Users(相關列:Id)的

的用戶具有與房客表沒有直接的聯繫。

我需要填滿一個第三表OptInMail(初步認識列:TenantIdUserIdOptInType)與爲每個用戶,每個租戶爲OptInTypeList的記錄的每個值。

OptInTypeList = 1, 2, 3, 10, 11, 14 

有什麼建議嗎?

回答

2
insert into OptInMail (TenantId, UserId, OptInType) 
    select 
     t.id, u.id, 1 
    from 
     Tenants as t, Users as u; 

...<put same statements with values 2,3,10,11 as far as there are not so many to write>... 

insert into OptInMail (TenantId, UserId, OptInType) 
    select 
     t.id, u.id, 14 
from 
    Tenants as t , Users as u ; 
+0

[不良習慣踢:使用舊樣式的JOIN(HTTP:/ /sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 表格樣式的舊式*逗號分隔列表是替換爲*中的* proper * ANSI'JOIN'語法ANSI - ** 92 ** SQL標準(**超過20年**之前)並且不鼓勵使用 –

+0

是的,它們已被棄用。不幸的是,無論你如何編寫它,CROSS JOIN在性能上都同樣糟糕。如果我寫一個,我仍然會回到老派的方法......它通常是演示代碼,我還沒有推動交叉加入生產。 –

+0

我想這個問題是關於如何填充表格一次。我首先做了一個快速解決方案,就是這樣。我同意你們兩個人的觀點。但在現實世界中,有時候有一個最快解決方案的地方,而不是完美的解決方案。 – yvs

1

試試這個:

insert into OptInMail (TenantId, UserId, OptInType) 
select distinct t.id, u.id, o.id 
from Tenants t cross join Users u cross join OptInTypeList o 

如果列表中沒有一個表:

insert into OptInMail (TenantId, UserId, OptInType) 
select distinct t.id, u.id, o.id 
from Tenants t cross join Users u cross join 
(
select 1 id union all 
select 2 id union all 
select 3 id union all 
select 10 id union all 
select 11 id union all 
select 14 id 
) o 
2
insert into OptInMail (TenantId, UserId, OptInType) 
select distinct t.id, u.id, o.id 
from Tenants t cross join Users u 
cross join (values (1), (3), (10), (11), (14)) o (id)