简体   繁体   English

在同一列上多次连接两个表,中间有一个查找表

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

This has probably been answered but, its hard to search for this question, as you can see in my confusing title.这可能已经得到回答,但是很难搜索这个问题,正如您在我令人困惑的标题中看到的那样。

Anyhow, I hope this example will help:无论如何,我希望这个例子会有所帮助:

表和期望的结果

The tricky part is the one to many relationship in the parameter lookup table.棘手的部分是参数查找表中的一对多关系。

Ive tried using multiple joins and aliases resulting in a hugh number of rows since Im getting every 'amount' for every 'price'.我尝试使用多个连接和别名导致大量行,因为我获得了每个“价格”的每个“金额”。

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'

Guessing I need sub-queries, but not sure where to place them.猜测我需要子查询,但不确定将它们放在哪里。

EDIT add some SQL code structure :编辑添加一些 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

I think the best way for build your excepted output and relevant schema you have to use pivot with dynamic sql because in next day it possible to have some new values it's the principal of your structure.我认为构建例外输出和相关模式的最佳方法必须将数据透视表与动态 sql 一起使用,因为在第二天可能会有一些新值,它是结构的主体。

But i think this query can be respond :但我认为这个查询可以响应:

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 

EDIT correction off previous query :编辑更正先前的查询:

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

RESULT :结果 :

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