我需要SQL語句以用於SQL Azure。來自多個表的SQL插入和整數列表
我有2個表的數據:
Tenants
(相關列:Id)的Users
(相關列:Id)的
的用戶具有與房客表沒有直接的聯繫。
我需要填滿一個第三表OptInMail
(初步認識列:TenantId
,UserId
,OptInType
)與爲每個用戶,每個租戶爲OptInTypeList
的記錄的每個值。
OptInTypeList = 1, 2, 3, 10, 11, 14
有什麼建議嗎?
我需要SQL語句以用於SQL Azure。來自多個表的SQL插入和整數列表
我有2個表的數據:
Tenants
(相關列:Id)的Users
(相關列:Id)的的用戶具有與房客表沒有直接的聯繫。
我需要填滿一個第三表OptInMail
(初步認識列:TenantId
,UserId
,OptInType
)與爲每個用戶,每個租戶爲OptInTypeList
的記錄的每個值。
OptInTypeList = 1, 2, 3, 10, 11, 14
有什麼建議嗎?
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 ;
試試這個:
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
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)
[不良習慣踢:使用舊樣式的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年**之前)並且不鼓勵使用 –
是的,它們已被棄用。不幸的是,無論你如何編寫它,CROSS JOIN在性能上都同樣糟糕。如果我寫一個,我仍然會回到老派的方法......它通常是演示代碼,我還沒有推動交叉加入生產。 –
我想這個問題是關於如何填充表格一次。我首先做了一個快速解決方案,就是這樣。我同意你們兩個人的觀點。但在現實世界中,有時候有一個最快解決方案的地方,而不是完美的解決方案。 – yvs