在SQL Server中生成两个集合的全组合交叉表方法
生成两个集合的全组合(笛卡尔积)
要得到两个相同集合的所有非NULL全组合,你需要用**笛卡尔积(Cross Join)**来生成,而不是分别插入单个字段的值。以下是两种可行的方法:
方法一:基于基础表生成
先创建一个存储基础集合的表,再通过自连接的Cross Join生成所有组合:
-- 创建存储基础值的表 CREATE TABLE base_values (val varchar(254)); INSERT INTO base_values (val) VALUES ('1'), ('2'), ('3'); -- 创建目标表并插入全组合 CREATE TABLE table1 (Var1 varchar(254), Var2 varchar(254)); INSERT INTO table1 (Var1, Var2) SELECT b1.val, b2.val FROM base_values b1 CROSS JOIN base_values b2;
方法二:直接用临时数据集生成
如果不需要保留基础表,可以直接用VALUES子句生成临时数据集,再做Cross Join:
-- 创建目标表并插入全组合 CREATE TABLE table1 (Var1 varchar(254), Var2 varchar(254)); INSERT INTO table1 (Var1, Var2) SELECT v1.val, v2.val FROM (VALUES ('1'), ('2'), ('3')) AS v1(val) CROSS JOIN (VALUES ('1'), ('2'), ('3')) AS v2(val);
为什么你之前的方法得不到预期结果?
你之前的INSERT语句是分别给Var1和Var2单独赋值,每次插入只会填充一个字段,另一个字段默认是NULL,所以最终得到6行带NULL的记录,而非两个集合的全组合。Cross Join会将第一个集合的每一条记录与第二个集合的每一条记录配对,正好生成你需要的9行非NULL全组合。
内容的提问来源于stack exchange,提问作者Diogo Batalha
相关产品推荐
相关产品推荐

