在同一列上多次联接两个表,中间使用一个查找表

克里斯托弗·拉姆斯登

可能已经回答了这个问题,但是很难找到这个问题,正如您在我令人困惑的标题中所看到的。

无论如何,我希望这个例子对您有帮助:

表和预期结果

棘手的部分是参数查找表中的一对多关系。

我已经尝试使用多个联接和别名,导致行数很大,因为Im为每个“价格”获取了每个“金额”。

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'

猜猜我需要子查询,但不确定在哪里放置子查询。

EDIT添加一些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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用ON子句中的OR在一个或另一列上的完整外部联接表

同一个表的列上的 SQL 连接与另一列上的 MAX

内部联接到同一表两次在同一列上

如何联接两个表,以使两个表中的同一列不重复?

当一列有多个代码时,我如何在一个列上联接两个表

SQL Server在一列上匹配两个表

在mysql中联接两个表时在一个表上使用限制

使用两个表上的联接从一个表中删除

如何在保留另一列中的值的同时连接一列上的两个表?

同一个表的多个列上的 SQL 联接

有两个外键指向另一个表的同一列的表

如何正常地在两个列上联接两个表,但是如果其中一个列包含null,那么结果必须包含仅与另一列匹配的行?

需要在第二个表中规定的一列上使用不同长度的子串连接两个表

序言中同一列表上的两个基于条件的替换函数?

将同一表上的两个左联接合并为一个

从一个表中的两个不同列中选择数据,这些列指向另一个表中的同一列

使用和修改同一列表对两个函数进行多处理

用两个不同条件的mysql在同一列上求和

合并两个熊猫数据框(在同一列上连接)

自定义排序器,用于同一列上的两个值

在同一列上应用两个过滤器

MySQL将在同一列上使用两个WHERE-X-IN-Y子句优化查询吗?

如何联接两个表,多次使用特定的列

在同一个表上有两个联接的竞争性WHERE

MySQL查询以查找一个表中一列的值是否在另一表中两列的两个值之间

两个不同的表与一个主表联接

联接两个表(一个需要串联)

MYSQL - 如何在同一个表上的两个不同行上减去两列?

在同一列的同一张表上多次进行内部联接