将一个 table 中的 3 列连接到另一个 table 中的 1 列
Joining 3 columns from one table to 1 column in another table
我正在尝试将表 1 连接到表 2,如下所示:
表 1:
| RecCurr | PayCurr | MTMCurr | TradeID |
|---------|---------|---------|---------|
| USD | CAD | JPY | 1234 |
表 2:
+------+-------+
| Curr | Value |
+------+-------+
| USD | 10 |
| CAD | 11 |
| JPY | 12 |
+------+-------+
已加入table:
+---------+---------+---------+---------+----------+----------+----------+
| RecCurr | PayCurr | MTMCurr | TradeID | RecValue | PayValue | MTMValue |
+---------+---------+---------+---------+----------+----------+----------+
| USD | CAD | JPY | 1234 | 10 | 11 | 12 |
+---------+---------+---------+---------+----------+----------+----------+
到目前为止,我唯一的解决方案如下:
SELECT T1.RecCurr, T1.PayCurr, T1.MTMCurr, T2.RecValue, T3.PayValue, T4.MTMValue
FROM
(SELECT RecCurr, PayCurr, MTMCurr FROM Table1) T1,
(SELECT RecCurr, RecValue FROM Table2) T2,
(SELECT PayCurr, PayValue FROM Table2) T3,
(SELECT MTMCurr, MTMValue FROM Table2) T4
where T1.RecCurr = T2.RecCurr
and T1.PayCurr = T3.PayCurr
and T4.MTMCurr = T4.MTMCurr
是否有更简洁的解决方案,不需要我将 Table2 与 Table1 连接 3 次?
当 FROM
子句中包含逗号时,始终 是编写查询的更好方法。此外,子查询是不必要的:
SELECT T1.RecCurr, T1.PayCurr, T1.MTMCurr,
T2r.RecValue, T2p.PayValue, T2m.MTMValue
FROM T1 JOIN
Table2 t2r
ON T2r.RecCurr = T1.RecCurr JOIN
Table2 t2p
ON t2p.PayCurr = t1.PayCurr
Table2 t2m
ON t2m.MTMCurr = t1.MTMCurr;
注意:以下是 ASE 上的作品;我认为它应该适用于 SQLAnywhere(和 IQ),但我目前没有 SQLAnywhere 数据库 运行 ...
如果您只想对 Table2 进行一次连接,那么您将需要一个执行 table 数据透视表的查询。
首先是设置:
create table Table1
(RecCurr char(3)
,PayCurr char(3)
,MTMCurr char(3)
,TradeID int)
go
insert Table1 values ('USD','CAD','JPY',1234)
go
create table Table2
(Curr char(3)
,Value int)
go
insert Table2 values ('USD',10)
insert Table2 values ('CAD',11)
insert Table2 values ('JPY',12)
go
select * from Table1
go
RecCurr PayCurr MTMCurr TradeID
------- ------- ------- -----------
USD CAD JPY 1234
select * from Table2
go
Curr Value
---- -----------
USD 10
CAD 11
JPY 12
对表 2 进行单个连接的示例查询:
select T1.RecCurr,
T1.PayCurr,
T1.MTMCurr,
T1.TradeID,
sum(case when T2.Curr = T1.RecCurr then T2.Value else 0 end) as RecValue,
sum(case when T2.Curr = T1.PayCurr then T2.Value else 0 end) as PayValue,
sum(case when T2.Curr = T1.MTMCurr then T2.Value else 0 end) as MTMValue
from Table1 T1,
Table2 T2
where T2.Curr in (T1.RecCurr, T1.PayCurr, T1.MTMCurr)
group by T1.RecCurr, T1.PayCurr, T1.MTMCurr, T1.TradeID
go
RecCurr PayCurr MTMCurr TradeID RecValue PayValue MTMValue
------- ------- ------- ----------- ----------- ----------- -----------
USD CAD JPY 1234 10 11 12
对于那些对逗号过敏的人(在 FROM
子句中):
select T1.RecCurr,
T1.PayCurr,
T1.MTMCurr,
T1.TradeID,
sum(case when T2.Curr = T1.RecCurr then T2.Value else 0 end) as RecValue,
sum(case when T2.Curr = T1.PayCurr then T2.Value else 0 end) as PayValue,
sum(case when T2.Curr = T1.MTMCurr then T2.Value else 0 end) as MTMValue
from Table1 T1
join Table2 T2
on T2.Curr in (T1.RecCurr, T1.PayCurr, T1.MTMCurr)
group by T1.RecCurr, T1.PayCurr, T1.MTMCurr, T1.TradeID
go
RecCurr PayCurr MTMCurr TradeID RecValue PayValue MTMValue
------- ------- ------- ----------- ----------- ----------- -----------
USD CAD JPY 1234 10 11 12
我正在尝试将表 1 连接到表 2,如下所示:
表 1:
| RecCurr | PayCurr | MTMCurr | TradeID |
|---------|---------|---------|---------|
| USD | CAD | JPY | 1234 |
表 2:
+------+-------+
| Curr | Value |
+------+-------+
| USD | 10 |
| CAD | 11 |
| JPY | 12 |
+------+-------+
已加入table:
+---------+---------+---------+---------+----------+----------+----------+
| RecCurr | PayCurr | MTMCurr | TradeID | RecValue | PayValue | MTMValue |
+---------+---------+---------+---------+----------+----------+----------+
| USD | CAD | JPY | 1234 | 10 | 11 | 12 |
+---------+---------+---------+---------+----------+----------+----------+
到目前为止,我唯一的解决方案如下:
SELECT T1.RecCurr, T1.PayCurr, T1.MTMCurr, T2.RecValue, T3.PayValue, T4.MTMValue
FROM
(SELECT RecCurr, PayCurr, MTMCurr FROM Table1) T1,
(SELECT RecCurr, RecValue FROM Table2) T2,
(SELECT PayCurr, PayValue FROM Table2) T3,
(SELECT MTMCurr, MTMValue FROM Table2) T4
where T1.RecCurr = T2.RecCurr
and T1.PayCurr = T3.PayCurr
and T4.MTMCurr = T4.MTMCurr
是否有更简洁的解决方案,不需要我将 Table2 与 Table1 连接 3 次?
当 FROM
子句中包含逗号时,始终 是编写查询的更好方法。此外,子查询是不必要的:
SELECT T1.RecCurr, T1.PayCurr, T1.MTMCurr,
T2r.RecValue, T2p.PayValue, T2m.MTMValue
FROM T1 JOIN
Table2 t2r
ON T2r.RecCurr = T1.RecCurr JOIN
Table2 t2p
ON t2p.PayCurr = t1.PayCurr
Table2 t2m
ON t2m.MTMCurr = t1.MTMCurr;
注意:以下是 ASE 上的作品;我认为它应该适用于 SQLAnywhere(和 IQ),但我目前没有 SQLAnywhere 数据库 运行 ...
如果您只想对 Table2 进行一次连接,那么您将需要一个执行 table 数据透视表的查询。
首先是设置:
create table Table1
(RecCurr char(3)
,PayCurr char(3)
,MTMCurr char(3)
,TradeID int)
go
insert Table1 values ('USD','CAD','JPY',1234)
go
create table Table2
(Curr char(3)
,Value int)
go
insert Table2 values ('USD',10)
insert Table2 values ('CAD',11)
insert Table2 values ('JPY',12)
go
select * from Table1
go
RecCurr PayCurr MTMCurr TradeID
------- ------- ------- -----------
USD CAD JPY 1234
select * from Table2
go
Curr Value
---- -----------
USD 10
CAD 11
JPY 12
对表 2 进行单个连接的示例查询:
select T1.RecCurr,
T1.PayCurr,
T1.MTMCurr,
T1.TradeID,
sum(case when T2.Curr = T1.RecCurr then T2.Value else 0 end) as RecValue,
sum(case when T2.Curr = T1.PayCurr then T2.Value else 0 end) as PayValue,
sum(case when T2.Curr = T1.MTMCurr then T2.Value else 0 end) as MTMValue
from Table1 T1,
Table2 T2
where T2.Curr in (T1.RecCurr, T1.PayCurr, T1.MTMCurr)
group by T1.RecCurr, T1.PayCurr, T1.MTMCurr, T1.TradeID
go
RecCurr PayCurr MTMCurr TradeID RecValue PayValue MTMValue
------- ------- ------- ----------- ----------- ----------- -----------
USD CAD JPY 1234 10 11 12
对于那些对逗号过敏的人(在 FROM
子句中):
select T1.RecCurr,
T1.PayCurr,
T1.MTMCurr,
T1.TradeID,
sum(case when T2.Curr = T1.RecCurr then T2.Value else 0 end) as RecValue,
sum(case when T2.Curr = T1.PayCurr then T2.Value else 0 end) as PayValue,
sum(case when T2.Curr = T1.MTMCurr then T2.Value else 0 end) as MTMValue
from Table1 T1
join Table2 T2
on T2.Curr in (T1.RecCurr, T1.PayCurr, T1.MTMCurr)
group by T1.RecCurr, T1.PayCurr, T1.MTMCurr, T1.TradeID
go
RecCurr PayCurr MTMCurr TradeID RecValue PayValue MTMValue
------- ------- ------- ----------- ----------- ----------- -----------
USD CAD JPY 1234 10 11 12