SQLUSA
Free Trial Save on Combos
SQL Server 2008 Best Practices
SQL Server 2005 Best Practices
SQL Server 2000 Best Practices
How to generate a cartesian product?

Execute the following Microsoft SQL Server T-SQL scripts in Management Studio Query Editor to demonstrate the creation of Cartesian products with CROSS JOIN.

-- MSSQL Cartesian product

-- Microsoft T-SQL cross join create a Cartesian product of two tables

USE AdventureWorks;

SELECT TOP 100 * FROM Sales.Customer CROSS JOIN Sales.SalesOrderHeader

GO

/* Partial results – all columns from both tables combined

 

CustomerID  TerritoryID AccountNumber     CustomerType      rowguid     ModifiedDate      SalesOrderID      RevisionNumber    OrderDate   DueDate     ShipDate    Status      OnlineOrderFlag   SalesOrderNumber  PurchaseOrderNumber     AccountNumber      CustomerID  ContactID   SalesPersonID     TerritoryID BillToAddressID   ShipToAddressID      ShipMethodID      CreditCardID      CreditCardApprovalCode  CurrencyRateID    SubTotal      TaxAmt      Freight     TotalDue    Comment     rowguid     ModifiedDate

1     1     AW00000001  S     3F5AE95E-B87D-4AED-95B4-C3797AFCB74F      2004-10-13 11:15:07.263      43659 1     2001-07-01 00:00:00.000 2001-07-13 00:00:00.000 2001-07-08 00:00:00.000      5     0     SO43659     PO522145787 10-4020-000676    676   378   279   5      985   985   5     16281 105041Vi84182     NULL  24643.9362  1971.5149   616.0984      27231.5495  NULL  79B65321-39CA-4115-9CBA-8FE0903E12E6      2001-07-08 00:00:00.000

 

*/

 

SELECT Records=COUNT(*) FROM Sales.Customer

GO

-- 19185

SELECT Records=COUNT(*) FROM  Sales.SalesOrderHeader

GO

-- 31465

SELECT Records=COUNT(*), CartesianProduct=19185 * 31465

FROM Sales.Customer CROSS JOIN Sales.SalesOrderHeader

GO

/*

Records           CartesianProduct

603656025         603656025

*/

-- SQL CROSS JOIN does not take an ON term - following will FAIL

SELECT Records=COUNT(*)

FROM Sales.Customer c

CROSS JOIN Sales.SalesOrderHeader soh

      ON c.CustomerID = soh.CustomerID

GO

/* Msg 156, Level 15, State 1, Line 4

Incorrect syntax near the keyword 'ON'.

*/

------------

-- SQL cross join to create all possible combinations

-- SQL combinations - Cartesian products

DECLARE  @Coin  TABLE(

                      Side CHAR(4)

                      )

INSERT @Coin SELECT 'head';

INSERT @Coin SELECT 'tail'

 

-- Single flip of a coin combinatorics

SELECT * FROM   @Coin

 

/*

head

tail

*/

 

-- Two flips of a coin combinatorics

SELECT *

FROM   @Coin a

       CROSS JOIN @Coin b

 

/*

head  head

tail  head

head  tail

tail  tail

*/

 

-- Three flips of a coin combinatorics

SELECT *

FROM   @Coin a

       CROSS JOIN @Coin b

       CROSS JOIN @Coin c

GO

/*

head  head  head

head  head  tail

tail  head  head

tail  head  tail

head  tail  head

head  tail  tail

tail  tail  head

tail  tail  tail

*/

------------

------------

-- SQL hexadecimal

------------

-- Microsoft SQL cte - Common Table Expression 

-- SQL hexadecimal sequence generation by Cartesian product

-- Create a cte to give the sequence of 0-F hex digits

WITH cteDigits

     AS (SELECT '0' AS Digit

         UNION

         SELECT '1'   UNION  SELECT '2'  UNION

         SELECT '3'   UNION  SELECT '4'  UNION

         SELECT '5'   UNION  SELECT '6'  UNION

         SELECT '7'   UNION  SELECT '8'  UNION

         SELECT '9'   UNION  SELECT 'A'  UNION

         SELECT 'B'   UNION  SELECT 'C'  UNION

         SELECT 'D'   UNION  SELECT 'E'  UNION

         SELECT 'F'  

         ),

     -- Create a second cte to generate a 1,048,576 number sequence

     cteHex5

     AS (SELECT SeqNo = hex65536.Digit+

     hex4096.Digit + hex256.Digit  + hex16.Digit

     + hex.Digit

         FROM   cteDigits AS hex

                -- SQL cross join

                CROSS JOIN cteDigits AS hex16

                CROSS JOIN cteDigits AS hex256

                CROSS JOIN cteDigits AS hex4096

                CROSS JOIN cteDigits AS hex65536)

               

-- Main query

-- T-SQL random select from cte

SELECT TOP 10 SeqNo

FROM     cteHex5

ORDER BY NEWID()

GO

/* Results

SeqNo

FDAA2

724B9

240DE

CAF5A

DBEB4

E720B

888DB

9A26C

CA838

D7BB5

*/

 

------------

 

 

The World Leader in SQL Server Training
 
SQLUSA.com Home Page