首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL-从不同列中的两个表中获取数据,而不使用联合

SQL-从不同列中的两个表中获取数据,而不使用联合
EN

Stack Overflow用户
提问于 2013-06-17 12:45:55
回答 3查看 3.6K关注 0票数 4

我有一个表STOCK,它看起来像这样:

代码语言:javascript
复制
PRODUCT   SALES_CODE  STOCK_1    STOCK_2    STOCK_3
-----------------------------------------------------
A         6-10        0          1          2

有很多STOCK_X存储桶,但为了简单起见,我将其排除在外。

现在我有了另一个表SIZE_GRID

代码语言:javascript
复制
SALES_CODE    SIZE_1   SIZE_2   SIZE_3
--------------------------------------
6-10          6        8        10

正如您可能已经猜到的那样,这些都是某个产品的库存,按大小排列。

我需要从第一个表中获取股票价值,并从第二个表中获取大小。最初,我做了以下工作

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-17 13:09:17

如果您使用的是SQL Server2008或更高版本,您可以尝试以下方法(找到here):

代码语言:javascript
复制
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中工作:

代码语言:javascript
复制
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)
;

但是,如果您使用的是更早的版本,这可能会有所帮助:

代码语言:javascript
复制
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,但它们仅合并单行,而不合并整个子集

票数 4
EN

Stack Overflow用户

发布于 2013-06-17 12:56:53

考虑对表进行规范化。而不是重复的列:

代码语言:javascript
复制
PRODUCT   SALES_CODE  STOCK_1    STOCK_2    STOCK_3

使用规格化表:

代码语言:javascript
复制
PRODUCT   SALES_CODE   STOCK_NO   STOCK

SIZE_GRID表也是如此:

代码语言:javascript
复制
SALES_CODE    SIZE_NO   SIZE

现在您无需列出40列即可进行查询:

代码语言:javascript
复制
select  *
from    STOCK s
join    SIZE_GRID sg
on      sg.SALES_CODE = s.SALES_CODE
        and sg.SIZE_NO = s.STOCK_NO
票数 3
EN

Stack Overflow用户

发布于 2013-06-17 12:56:53

以下是您可以使用的一些替代方案:

  • 分别执行每个SQL,并在您的程序中合并和排序结果集
  • 连接表。
  • 使用标量子查询。

选择

从Table_1 q1中选择col1、col2、col3,

select col1,col2,col3 from Table_2 q2 from dual;

  • 尝试使用具有NVL函数的完全外连接的UNION :建议此函数具有比UNION运算符更快的性能。

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;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17140557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档