我有一个表STOCK,它看起来像这样:
PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3
-----------------------------------------------------
A 6-10 0 1 2有很多STOCK_X存储桶,但为了简单起见,我将其排除在外。
现在我有了另一个表SIZE_GRID
SALES_CODE SIZE_1 SIZE_2 SIZE_3
--------------------------------------
6-10 6 8 10正如您可能已经猜到的那样,这些都是某个产品的库存,按大小排列。
我需要从第一个表中获取股票价值,并从第二个表中获取大小。最初,我做了以下工作
SELECT
STOCK.PRODUCT,
SIZE_GRID.SIZE_1,
STOCK.STOCK_1
FROM
STOCK
INNER JOIN
SIZE_GRID ON
SIZE_GRID.SALES_CODE = STOCK.SALES_CODE
UNION ALL
SELECT
STOCK.PRODUCT,
SIZE_GRID.SIZE_2,
STOCK.STOCK_2
FROM
STOCK
INNER JOIN
SIZE_GRID ON
SIZE_GRID.SALES_CODE = STOCK.SALES_CODE
UNION ALL
SELECT
STOCK.PRODUCT,
SIZE_GRID.SIZE_3,
STOCK.STOCK_3
FROM
STOCK
INNER JOIN
SIZE_GRID ON
SIZE_GRID.SALES_CODE = STOCK.SALES_CODE我需要检索大约40个STOCK_X,所以想知道有没有更简单的方法呢?我最好使用纯SQL,而不使用UDF/SP。
http://sqlfiddle.com/#!6/f323e
发布于 2013-06-17 13:09:17
如果您使用的是SQL Server2008或更高版本,您可以尝试以下方法(找到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)
;通过一个小的调整,你也可以让它在SQL Server2005中工作:
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)
;但是,如果您使用的是更早的版本,这可能会有所帮助:
SELECT
STOCK.PRODUCT,
SIZE = CASE X.N
WHEN 1 THEN SIZE_GRID.SIZE_1
WHEN 2 THEN SIZE_GRID.SIZE_2
WHEN 3 THEN SIZE_GRID.SIZE_3
END,
STOCK = CASE X.N
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)
;尽管后两个选项使用UNION ALL,但它们仅合并单行,而不合并整个子集
发布于 2013-06-17 12:56:53
考虑对表进行规范化。而不是重复的列:
PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3使用规格化表:
PRODUCT SALES_CODE STOCK_NO STOCKSIZE_GRID表也是如此:
SALES_CODE SIZE_NO SIZE现在您无需列出40列即可进行查询:
select *
from STOCK s
join SIZE_GRID sg
on sg.SALES_CODE = s.SALES_CODE
and sg.SIZE_NO = s.STOCK_NO发布于 2013-06-17 12:56:53
以下是您可以使用的一些替代方案:
选择
从Table_1 q1中选择col1、col2、col3,
select col1,col2,col3 from Table_2 q2 from dual;
select empno,ename,nvl(dept.deptno,emp.deptno) deptno,dname from emp full outer join dept on (emp.deptno = dept.deptno) order by 1,2,3,4;
https://stackoverflow.com/questions/17140557
复制相似问题