簡體   English   中英

SQL-從不同列中的兩個表中獲取數據,而不使用聯合

[英]SQL- get data from two tables in different columns without using unions

我有一個表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

正如您可能已經猜到的那樣,根據尺寸,這些是某種產品的庫存。

我需要從第一個表中獲取STOCK值,從第二個表中獲取大小。 最初,我正在做以下事情

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

如果您使用的是SQL Server 2008或更高版本,則可以嘗試以下方法(在此處找到):

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 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,但它們僅組合單行,而不是整個子集

考慮規范化表格。 而不是重復列:

PRODUCT   SALES_CODE  STOCK_1    STOCK_2    STOCK_3

使用規范化表格:

PRODUCT   SALES_CODE   STOCK_NO   STOCK

對於SIZE_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

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

  • 分別執行每個SQL並對程序中的結果集進行合並和排序
  • 加入表格。
  • 使用標量子查詢。

選擇
從Table_1 q1中選擇col1,col2,col3,

選擇表2中的col1,col2,col3來自double的q2;

  • 使用帶有NVL功能的FULL OUTER JOIN嘗試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; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM