如何编写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
相关产品推荐
相关产品推荐

