如何连接两个表并在PL / SQL中返回一行?

时间:2015-09-29 08:24:48

标签: join plsql

我有2个表,其名称是FIRST和USERS。在FIRST表中,我有USERID1,USERID2和USERID3列。和USERS表我保存了USERID的姓名和姓氏值。如果我加入表格;

SELECT f.userid1, f.userid2, f.userid3, u.name, u.surname
FROM users u, first f
WHERE f.userid1=u.userid AND f.userid2=u.userid AND f.userid3=u.userid

我想将此结果返回1行,如;

121314 name surname 131415 name surname 141516 name surname

FIRST表结果示例;

no   no2             userid1  userid2  userid3  ...
7    100000545       121314   131415  141516   ....

USER TABLE

id        name      surname
121314    black      smoke
131415    jack       shephard
141516    john       locke

我想结果像用户表,但我必须加入,因为即将到来的结果必须根据FIRST表中的记录

2 个答案:

答案 0 :(得分:1)

通常,要在一行中检索结果,您需要使用聚合函数。您可以尝试根据您的要求调整以下查询:

WITH first AS
(
  SELECT
    7 AS no
    ,100000545 AS no2
    ,121314 AS userid1
    ,131415 AS userid2
    ,141516 AS userid3
  FROM
    dual
)
, users AS
(
  SELECT
    DECODE(LEVEL
      ,1,121314
      ,2,131415
      ,3,141516
    ) AS id
    ,DECODE(LEVEL
      ,1,'black'
      ,2,'jack'
      ,3,'john'
    ) AS name
    ,DECODE(LEVEL
      ,1,'smoke'
      ,2,'shephard'
      ,3,'locke'
    ) AS surname
  FROM
    dual
  CONNECT BY LEVEL < 4
)
SELECT
  TRIM(XMLAGG(XMLELEMENT(e, s.id||' '||s.name||' '||s.surname||' ')).EXTRACT('//text()').getClobVal()) AS one_row_result
FROM
  first f
  ,users s
WHERE
  s.id IN (f.userid1, f.userid2, f.userid3)

答案 1 :(得分:0)

不一定是关于plsql,而是一般的sql

在您的查询&#34; u.userid&#34;将永远是同一行中的一个字段。
因此,只要f.userid1,f.userid2,f.userid3不保持相同的值,您就不会获得任何结果。我认为你想要实现的是获得3个用户,其id存储在第一个表中,因此你必须引用&#34;用户&#34;表三次。
要获得示例中的行,查询将如下所示:

SELECT f.userid1, u_first.name , u_first.surname, 
       f.userid2, u_second.name, u_second.surname,
       f.userid3, u_third.name, u_third.surname
FROM users u_first, users u_second, users u_third, first f 
WHERE f.userid1=u_first.userid 
  AND f.userid2=u_second.userid 
  AND f.userid3=u_third.userid

有人肯定会在这里提供正确的加入。

修改

对于您的示例数据,请选择结果

121314 black smoke 131415 jack shepard 141516 john locke

但是请注意,您没有指定第一个表中要获取此连接的行,因此如果来自User表的行可以满足这些条件,您将获得First表中每行的结果行(我希望你能正确设置约束)

如果您只想为一个特定的Field行获取一行,请添加

AND f.no=7

在查询结束时

如果您希望收到的输出是:

121314    black      smoke
131415    jack       shephard
141516    john       locke

尝试:

SELECT f.userid1, u.name ,u.surname, 
FROM users u, first f 
WHERE f.userid1=u.userid 
  OR f.userid2=u.userid 
  OR f.userid3=u.userid
  AND f.no=7

这是一种实际测试的好方法,是否所有具有这些ID的用户都存在于数据库中 但请记住,结果中的顺序与User表中的项目顺序相同,因此它不一定与f.first相同,然后是f.second,然后是f.third