通过连接表 (SQL) 从两个 id 中获取名称

时间:2021-07-21 06:11:26

标签: sql

第一张桌子

<头>
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 的名称?

2 个答案:

答案 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;

或与 UNIONPIVOT

相同
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
;
相关问题