第一张桌子
MEMO_ID1 | MEMO_ID2 | UPDATED_BY |
---|---|---|
1 | 2 | 鲍勃 |
第二桌
MEMO_ID1 | MEMO_NAME |
---|---|
1 | UD |
2 | LD |
我想要的结果表:
MEMO_ID1 | MEMO_ID2 | UPDATED_BY |
---|---|---|
UD | LD | 鲍勃 |
SELECT u.MEMO_ID1, u.MEMO_ID2, u.UPDATED_BY
FROM USER u;
如何加入 user 和 memo 表以获取两个不同 ID 的名称?
答案 0 :(得分:2)
试试下面的:
select t2.MEMO_ID1,t2.MEMO_NAME,t11.UPDATED_BY
from table2 t2
join table1 t11 on t2.MEMO_ID1=t11.MEMO_ID1
join table1 t12 on t2.MEMO_ID1=t12.MEMO_ID2
where t11.UPDATED_BY=t12.UPDATED_BY
答案 1 :(得分:0)
你没有提到你正在使用的数据库引擎,所以我会用 T-SQL 来做所有的事情。其他数据库引擎有自己的数据透视功能
为了将 table1 中的数据与 table2 连接起来,您需要旋转 table1。
要旋转这些数据,您有两种方法:
一种选择是使用UNPIVOT
SELECT updated_by, pvt_id
FROM (
SELECT memo_id1, memo_id2, updated_by
FROM t1
) pvt
UNPIVOT (pvt_id FOR col_names IN (memo_id1, memo_id2)) AS unpvt
另一个是UNION这样的数据
SELECT memo_id1, updated_by
FROM t1
UNION
SELECT memo_id2, updated_by
FROM t1
现在您可以将这些数据与 table2 连接起来,并将结果转回
WITH source AS
(
SELECT updated_by, pvt_id
FROM
(
SELECT memo_id1
,memo_id2
,updated_by
FROM t1
) pvt UNPIVOT (pvt_id FOR col_names IN (memo_id1, memo_id2)) AS unpvt
),
r1 AS
(
SELECT *
FROM source s
LEFT JOIN t2
ON t2.memo_id = s.pvt_id
)
SELECT updated_by, [1] AS [memo1], [2] AS [memo2]
FROM
(
SELECT updated_by, memo_name, memo_id
FROM r1
) pvt
PIVOT (MIN(memo_name) for memo_id IN ([1] , [2])) AS pvt2;
或与 UNION 和 PIVOT
相同WITH source (m_id, updated_by) AS
(
SELECT memo_id1, updated_by
FROM t1 union
SELECT memo_id2, updated_by
FROM t1
),
r1 AS
(
SELECT *
FROM source
LEFT JOIN t2
ON t2.memo_id = t1_data.m_id
)
SELECT updated_by,[1] AS [memo1],[2] AS [memo2]
FROM
(
SELECT updated_by, memo_name, memo_id
FROM r1
) pvt
PIVOT (MIN(memo_name) for memo_id IN ([1], [2])) AS pvt2;
如果您确实需要在没有可扩展性的情况下解决示例的数据,那么甚至是更简单的解决方案
with source (m_id, updated_by) as (
select memo_id1, updated_by
from t1
union
select memo_id2, updated_by
from t1
)
select s.updated_by, min(t2.memo_name) [memo1], max(t2.memo_name) [memo2]
from source s
LEFT JOIN t2 on t2.memo_id = s.m_id
group BY s.updated_by
;