簡體   English   中英

在同一列上多次連接兩個表,中間有一個查找表

[英]Join two tables multiple times on same column with a lookup table in between

這可能已經得到回答,但是很難搜索這個問題,正如您在我令人困惑的標題中看到的那樣。

無論如何,我希望這個例子會有所幫助:

表和期望的結果

棘手的部分是參數查找表中的一對多關系。

我嘗試使用多個連接和別名導致大量行,因為我獲得了每個“價格”的每個“金額”。

SELECT paraval.month, paraval.value as amount, paraval2.value as price, trade.position
FROM trade
INNER JOIN parameter para on trade.tID=para.tID and para.name = 'amount'
INNER JOIN parametervalues paraval on para.pID=paraval.pID

INNER JOIN parameter para2 on trade.tID=para2.tID and para2.name = 'price'
INNER JOIN parametervalues paraval2 on para2.pID=paraval2.pID
WHERE trade.type = 'cert'

猜測我需要子查詢,但不確定將它們放在哪里。

編輯添加一些 SQL 代碼結構:

CREATE TABLE #Trade  
(
    tID             int PRIMARY KEY,  
    type            varchar(50),
    position        int
 );  
CREATE TABLE #Parameter  
(
    pID             int PRIMARY KEY, 
    tID             int, 
    name            varchar(50)
);  
CREATE TABLE #ParameterValue  
(
    pID         int,  
    smonth      varchar(50),
    value       varchar(50));  


INSERT INTO #Trade 
SELECT 1, 'stock', 1
UNION
SELECT 2, 'stock', 2
UNION
SELECT 3, 'cert', 3

INSERT INTO #Parameter 
SELECT 1,1,'amount'
UNION
SELECT 2,1,'price'
UNION
SELECT 3,2,'amount'
UNION
SELECT 4,2,'price'
UNION
SELECT 5,3,'amount'
UNION
SELECT 6,3,'price'

INSERT INTO #ParameterValue
SELECT 1,1,'5'
UNION
SELECT 2,1,'500'
UNION
SELECT 3,1,'15'
UNION 
SELECT 4,1,'300'
UNION
SELECT 5,1,'5'
UNION
SELECT 5,2,'10'
UNION
SELECT 5,3,'5'
UNION
SELECT 6,1,'100'
UNION
SELECT 6,2,'200'
UNION 
SELECT 6,3,'300'

-- SELECT * FROM #Trade

-- SELECT * FROM #Parameter

-- SELECT * FROM #ParameterValue


DROP TABLE #Trade
DROP TABLE #Parameter
DROP TABLE #ParameterValue

我認為構建例外輸出和相關模式的最佳方法必須將數據透視表與動態 sql 一起使用,因為在第二天可能會有一些新值,它是結構的主體。

但我認為這個查詢可以響應:

SELECT paraval.month, (case when para. name = 'amount' then max(paraval.value) else null end)as amount, (case when para. name = 'price' then  max(paraval.value) else null end) as price, max(trade.position) as position 
FROM trade
INNER JOIN parameter para on trade.tID=para.tID 
INNER JOIN parametervalues paraval on para.pID=paraval.pID
WHERE trade.type = 'cert'
Group by paraval.month 

編輯更正先前的查詢:

CREATE TABLE #Trade  
(
    tID             int PRIMARY KEY,  
    type            varchar(50),
    position        int
 );  
CREATE TABLE #Parameter  
(
    pID             int PRIMARY KEY, 
    tID             int, 
    name            varchar(50)
);  
CREATE TABLE #ParameterValue  
(
    pID         int,  
    smonth      varchar(50),
    value       varchar(50));  


INSERT INTO #Trade 
SELECT 1, 'stock', 1
UNION
SELECT 2, 'stock', 2
UNION
SELECT 3, 'cert', 3

INSERT INTO #Parameter 
SELECT 1,1,'amount'
UNION
SELECT 2,1,'price'
UNION
SELECT 3,2,'amount'
UNION
SELECT 4,2,'price'
UNION
SELECT 5,3,'amount'
UNION
SELECT 6,3,'price'

INSERT INTO #ParameterValue
SELECT 1,1,'5'
UNION
SELECT 2,1,'500'
UNION
SELECT 3,1,'15'
UNION 
SELECT 4,1,'300'
UNION
SELECT 5,1,'5'
UNION
SELECT 5,2,'10'
UNION
SELECT 5,3,'5'
UNION
SELECT 6,1,'100'
UNION
SELECT 6,2,'200'
UNION 
SELECT 6,3,'300'


/***/
-- Perform select 
/***/
SELECT t.tID, paraval.smonth, MAX(case when para.name = 'amount' then paraval.value else null end)as amount, MAX(case when para.name = 'price' then  paraval.value else null end) as price, max(T.position) as position 
FROM #Trade T
INNER JOIN #Parameter para on T.tID=para.tID 
INNER JOIN #ParameterValue paraval on para.pID=paraval.pID
Group by T.tId, paraval.smonth
/***/

DROP TABLE #Trade
DROP TABLE #Parameter
DROP TABLE #ParameterValue

結果 :

tID smonth  amount  price   position
1   1       5       500     1
2   1       15      300     2
3   1       5       100     3
3   2       10      200     3
3   3       5       300     3

暫無
暫無

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

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