You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写T-SQL的Full Outer Join语句实现两表数据全量组合?

解决两个表全量配对的问题

嘿,你要实现的是两个表的笛卡尔积(也就是每个cc和每个dte的所有组合),用FULL OUTER JOIN其实不是最优选择——直接用CROSS JOIN就可以完美搞定,而且写法更直观。

正确的实现代码

你可以把插入逻辑改成这样,直接通过CROSS JOIN生成所有组合并插入到@outtbl:

declare @cctbl table ([cc] [int]);
insert into @cctbl ([cc]) values (1),(2),(3);
declare @datetbl table ([dte] [date]);
insert into @datetbl ([dte]) values ('20180320'),('20180321'),('20180322');
declare @outtbl table ([cc] [int],[dte] [date]);

-- 核心逻辑:用CROSS JOIN生成全量配对
INSERT INTO @outtbl (cc, dte)
SELECT c.cc, d.dte
FROM @cctbl c
CROSS JOIN @datetbl d;

-- 查看结果
SELECT * FROM @outtbl;

为什么不用FULL OUTER JOIN?

如果非要用FULL OUTER JOIN来实现,你需要在ON子句里写一个永远为真的条件(比如ON 1 = 1),这样数据库会把两个表的所有行都关联起来,效果和CROSS JOIN一样,但这种写法不够语义化——别人看代码的时候,第一反应会疑惑你为什么要这么写,而CROSS JOIN一看就知道是要生成全组合。

举个例子,用FULL OUTER JOIN的写法是这样(不推荐):

INSERT INTO @outtbl (cc, dte)
SELECT c.cc, d.dte
FROM @cctbl c
FULL OUTER JOIN @datetbl d ON 1 = 1;

总之,CROSS JOIN是专门处理这种全量配对场景的工具,更靠谱也更易读~

内容的提问来源于stack exchange,提问作者dya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:51:56