SQL-不使用联合从不同列中的两个表中获取数据
我有一个表SQL-不使用联合从不同列中的两个表中获取数据,sql,sql-server,Sql,Sql Server,我有一个表STOCK,看起来像这样: PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3 ----------------------------------------------------- A 6-10 0 1 2 有许多STOCK_Xbucket,但为了简单起见,我将其排除在外 现在我有了另一个表大小\u网格: SALES_CODE SIZE_1 SIZE_
STOCK
,看起来像这样:
PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3
-----------------------------------------------------
A 6-10 0 1 2
有许多STOCK_X
bucket,但为了简单起见,我将其排除在外
现在我有了另一个表大小\u网格
:
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只股票需要取回,所以想知道是否有更简单的方法来取回?我最好使用纯SQL而不使用UDF/SP
以下是一些您可以使用的替代方案:
- 分别执行每个SQL,并在程序中合并和排序结果集
- 加入表格李>
- 使用标量子查询
从表1 q1中选择col1、col2、col3 选择col1,col2, 来自表2的col3来自双通道的q2
- 尝试使用NVL函数的完全外部联接进行UNION:建议这比UNION运算符具有更快的性能
考虑规范化表。而不是重复列:
PRODUCT SALES_CODE STOCK_1 STOCK_2 STOCK_3
使用规范化表:
PRODUCT SALES_CODE STOCK_NO STOCK
尺寸网格表也一样:
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
如果您使用的是SQL Server 2008或更高版本,则可以尝试以下方法(找到): 只需稍作调整,您就可以使其在SQL Server 2005中正常工作:
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,但它们仅合并单行,而不是整个子集除了繁琐之外,将上述方法包装到视图中有什么问题?不是选项。这是一个非常古老的遗留系统。我认为这是实现这一目标的唯一方法,最好是更好的方法。不可能像上面提到的那样。效果很好。它不仅要干净得多(从600行到100行),而且比unions快得多(从7秒到10秒)
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)
;