使用第一个表中的两个不同列查询联接两个表

时间:2018-07-19 12:40:43

标签: sql oracle

我有两个桌子。

表A:

Table A ID  Table Name  owner1ID    owner2ID
1             Work1         85         91
2             Work2         86         92
3             Work3         87         93
4             Work4         88         94
5             Work5         89         95
6             Work6         90         96

表B:

OwnerID 0WNERFIRSTNAME  0WNERlASTNAME
   85           A            M
   86           B            N
   87           C            O
   88           D            P
   90           E            Q
   91           F            R
   89           G            S
   92           H            T
   86           I            U
   94           J            V
   93           K            W
   95           L            X

您能帮我得到一个需要包含TABLEID OWNERFIRSTNAME和OWNERSECONDNAME的表的查询吗?

预期输出:

TableAID 0WNER1FIRSTNAME 0WNER1LASTNAME 0WNER2FIRSTNAME 0WNER2LASTNAME
   1            A               M              F            R

2 个答案:

答案 0 :(得分:4)

您需要加入TableB 两次

这意味着您需要为表的每个实例赋予一个别名,以便区分要引用的实例...

SELECT
  TableA.TableAID,
  TableB1.0WNERFIRSTNAME    AS 0WNER1FIRSTNAME,
  TableB1.0WNERlASTNAME     AS 0WNER1LASTNAME,
  TableB2.0WNERFIRSTNAME    AS 0WNER2FIRSTNAME,
  TableB2.0WNERlASTNAME     AS 0WNER2LASTNAME
FROM
  TableA
INNER JOIN
  TableB    TableB1
    ON TableB1.OwnerID = TableA.owner1ID
INNER JOIN
  TableB    TableB2
    ON TableB2.OwnerID = TableA.owner2ID

P.S。 。请勿将0WNERFIRSTNAME拼写为零,而将其OWNERFIRSTNAME拼写!

答案 1 :(得分:0)

虽然MatBaile的答案是最常见的做法,但您自己的示例显示了一些问题。首先,我们丢失了有关表6的信息,而在第二个表中找不到该表的第二个所有者。可以使用left join轻松纠正:

select a.id,  a.table_name, 
       b1.OwnerFirstName O1FN, b1.OwnerLastName O1LN, 
       b2.OwnerFirstName O2FN, b2.OwnerLastName O2LN
  from a 
  left join b b1 on b1.OwnerId = a.Owner1Id
  left join b b2 on b2.OwnerId = a.Owner2Id

什么给了我们

        ID TABLE_NAME O1FN O1LN O2FN O2LN
---------- ---------- ---- ---- ---- ----
         1 Work1      A    M    F    R
         2 Work2      I    U    H    T               <-- two first owners
         2 Work2      B    N    H    T               <-- two first owners
         4 Work4      D    P    J    V
         3 Work3      C    O    K    W
         5 Work5      G    S    L    X
         6 Work6      E    Q                         <-- null second owner

第二个问题-对于表2,我们有两个条目,因为在您的示例中,两个拥有id = 86的所有者。我怀疑这是拼写错误,但在类似情况下可能会发生。您可以保留原样,或者仅保留最后一行(如果所有者更改,并且在某个日期列中有关于此的信息),或者可以使用listagg()列出所有所有者,或者采用最大值。当有更多行连接到1.和2.所有者时,情况会变得更糟。

出于好奇,这里是unpivot-pivot解决方案。在这种情况下,此查询看起来更复杂,但是如果有10列,则必须进行10次连接,并且在此查询中,仅列列表需要更改。

select * 
  from (
    select id, table_name, type, ownerfirstname, ownerlastname
      from (select * from a unpivot (ownerId for type in (owner1ID as 1, owner2ID as 2))) a
      join b using (ownerId))
  pivot (listagg(ownerfirstname||' '||ownerlastname, ', ') within group (order by null) owner 
         for type in (1, 2))

SQL Fiddle demo

        ID TABLE_NAME 1_OWNER    2_OWNER
---------- ---------- ---------- ----------
         1 Work1      A M        F R
         2 Work2      B N, I U   H T          <-- listagg() used to aggregate data
         3 Work3      C O        K W
         4 Work4      D P        J V
         5 Work5      G S        L X
         6 Work6      E Q