If you are in SQL Server 2008 or later, you can try the following method (found here ):
SELECT STOCK.PRODUCT, X.SIZE, X.STOCK FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE CROSS APPLY ( VALUES (SIZE_GRID.SIZE_1, STOCK.STOCK_1), (SIZE_GRID.SIZE_2, STOCK.STOCK_2), (SIZE_GRID.SIZE_3, STOCK.STOCK_3) ) X (SIZE, STOCK) ;
With a little tweaking, you can make it work in SQL Server 2005 too:
SELECT STOCK.PRODUCT, X.SIZE, X.STOCK FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE CROSS APPLY ( SELECT SIZE_GRID.SIZE_1, STOCK.STOCK_1 UNION ALL SELECT SIZE_GRID.SIZE_2, STOCK.STOCK_2 UNION ALL SELECT SIZE_GRID.SIZE_3, STOCK.STOCK_3 ) X (SIZE, STOCK) ;
However, if you are using an even earlier version, this may help:
SELECT STOCK.PRODUCT, SIZE = CASE XN WHEN 1 THEN SIZE_GRID.SIZE_1 WHEN 2 THEN SIZE_GRID.SIZE_2 WHEN 3 THEN SIZE_GRID.SIZE_3 END, STOCK = CASE XN WHEN 1 THEN STOCK.STOCK_1 WHEN 2 THEN STOCK.STOCK_2 WHEN 3 THEN STOCK.STOCK_3 END, FROM STOCK INNER JOIN SIZE_GRID ON SIZE_GRID.SALES_CODE = STOCK.SALES_CODE CROSS JOIN ( SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 ) X (N) ;
Although the last two options use UNION ALL, they only combine single lines, not whole subsets.