Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-不使用联合从不同列中的两个表中获取数据_Sql_Sql Server - Fatal编程技术网

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)
;