2016-08-20 29 views
-4

這是我擁有的兩張桌子。我應該如何加入這兩張表?

| StockId | Item1 | Quantity1| 
    1  10  5 
    1  11  6 

| StockId | Item2 | Quantity2 | 
    1  12  4 

我需要連接這兩個表,讓我得到的輸出:

| StockId | Item1 | Quantity1 | Item2 | Quantity2 | 
     1  10  5   12  4 
     1  11  6   -  - 

每個表可能含有1個或多個行。我嘗試過連接表,但這不起作用。

SELECT * FROM Table1 
INNER JOIN Table2 ON Table1.StockId = Table2.StockId 

這會給我的輸出:

| StockId | Item1 | Quantity1 | Item2 | Quantity2 | 
     1  10  5   12  4 
     1  11  6   12  4 

回答

1

您的數據庫好像是需要重新思考,因爲你的要求是不說清楚,但你可以像這樣做:

select * 
from 
(select row_number() over (order by Item1) as RN, * from Table1) T1 
full outer join 
(select row_number() over (order by Item2) as RN, * from Table2) T2 
on T1.RN = T2.RN 
2

@JamesZ您的查詢將在以下情況下會失敗..你生成基於項目1和項目2 RN和不考慮StockId也同時加盟你不考慮StockIds兩個表。 在下面的示例中,我添加了更多行以確保查詢提供了正確的結果。

CREATE TABLE #T1 (StockId INT ,Item1 INT,Quantity1 INT) 
CREATE TABLE #T2 (StockId INT ,Item2 INT,Quantity2 INT) 

INSERT INTO #T1 
SELECT 1,10,5 UNION ALL 
SELECT 1,11,6 UNION ALL 
SELECT 1,9 ,6 UNION ALL 
SELECT 1,8 ,6 UNION ALL 
SELECT 2,10,5 UNION ALL 
SELECT 2,11,6 

INSERT INTO #T2 
SELECT 1,12,4 UNION ALL 
SELECT 2,12,4 

;WITH T1 
AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY StockId ORDER BY Item1) AS RN, * 
    FROM #T1 
) 
,T2 
AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY StockId ORDER BY Item2) AS RN, * 
    FROM #T2 
) 
SELECT T1.StockId,T1.Item1,T1.Quantity1,T2.StockId,T2.Item2,T2.Quantity2 
FROM T1 
FULL JOIN T2 ON T1.StockId = T2.StockId AND T1.RN = T2.RN