如何最好地产生具有同一表的不同列的笛卡尔积?

时间:2018-08-13 22:03:57

标签: tsql self-join cross-join

假设我有一个包含以下列的表ManjoloHighFirstname, Surname, Age, Gender, Village,并且您需要根据以下这两列来生成笛卡尔乘积:Village, Firstname

在T-SQL中生产笛卡尔积的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

通过命名列和对同一表进行别名不同地满足了生成笛卡尔积的要求,如下所示:

SELECT V.Village, F.Firstname 
FROM MANJOLOHIGH AS V 
CROSS JOIN MANJOLOHIGH AS F; 

此代码将产生V.Village行乘以F.Firstname行的结果集。

答案 1 :(得分:1)

@Lanceleazol,请参见以下修改:您将需要一个分隔符以防止出现重复条目​​。

SELECT DISTINCT V.Village, F.Firstname 
FROM MANJOLOHIGH AS V 
CROSS JOIN ( SELECT DISTINCT F.Firstname 
                FROM
                 MANJOLOHIGH AS F) F 

答案 2 :(得分:0)

假设您要检索给定列中值的一组唯一可能的组合。

您可以通过创建一个巨大的笛卡尔积,然后跟DISTINCT来爆炸结果集,如下所示:

SELECT DISTINCT V.Village, F.Firstname 
FROM MANJOLOHIGH AS V 
CROSS JOIN MANJOLOHIGH AS F

或者您可以在每列中创建唯一值的子集,然后交叉连接它们,如下所示:

SELECT V.Village, F.Firstname 
FROM (SELECT DISTINCT Village FROM MANJOLOHIGH) AS V 
CROSS JOIN (SELECT DISTINCT Firstname FROM MANJOLOHIGH) AS F

鉴于您正在谈论五栏,我强烈建议后者。 给定一个包含1000条记录的表,在应用DISTINCT之前,第一个结果集将产生1000 * 1000 * 1000 * 1000 * 1000 * 1000条记录。