oracle 如何选择内部查询的结果作为输出

rggaifut  于 2023-05-16  发布在  Oracle
关注(0)|答案(3)|浏览(141)

如何在select语句中获取内部查询的列作为输出?这里需要通过select语句返回users表中的lang。这个查询有可能吗?

SELECT ID, LANG  -- THIS LANG IS NOT WORKING
INTO V_TRAVEL_ID, V_LANG
FROM TRAVEL_TABLE
WHERE USER_ID = (SELECT MYID, LANG -- this LANG column needs to be returned from the query
                 FROM USERS
                 WHERE CONTACT_ID = V_CONTACT_ID);
csbfibhn

csbfibhn1#

您的查询的措辞方式确实允许您过滤每个用户联系人的旅行,但您无法访问相关用户的详细信息-因为主查询仅从旅行表中选择。
也许你想要一个join代替;这允许您过滤数据集 * 和 *,使两个表的列可用于select

SELECT t.id, u.lang
INTO v_travel_id, v_lang
FROM travel_table t
INNER JOIN users u ON u.id = t.user_id
WHERE u.contact_id = v_contact_id
tp5buhyn

tp5buhyn2#

如果users表将为travel_table中的每一行匹配一行,则:

SELECT t.ID,
       u.LANG
INTO   V_TRAVEL_ID,
       V_LANG
FROM   TRAVEL_TABLE t
       INNER JOIN USERS u
       ON u.MYID = t.USER_ID
WHERE  u.CONTACT_ID = V_CONTACT_ID;

如果users表可以匹配多个行,并且您希望匹配IN过滤器的行为,并且只匹配其中一个,那么在Oracle 12中,您可以使用LATERAL连接并仅获得第一个匹配:

SELECT t.ID,
       u.LANG
INTO   V_TRAVEL_ID,
       V_LANG
FROM   TRAVEL_TABLE t
       CROSS JOIN LATERAL (
         SELECT u.LANG
         FROM   USERS u
         WHERE  u.CONTACT_ID = V_CONTACT_ID                                                 
         AND    u.MYID       = t.USER_ID
         -- ORDER BY something
         FETCH FIRST ROW ONLY
       ) u;
9rnv2umw

9rnv2umw3#

无论出于何种原因,如果你想使用子查询而不是内部连接,那么cross apply/cross join lateral应该可以做到。, lateral是最短的。:)

select * from travel_table

要么

cross apply (select * from t2 users
where contact_id = v_contact_id and user_id = myid)

cross join lateral (select * from users
where contact_id = v_contact_id and user_id = myid)

, lateral (select * from t2 users
where contact_id = v_contact_id and user_id = myid)

上面3个查询和原始查询的主要区别是,原始查询只能返回0或1行,而上面的任何一个查询都可以返回任意数量的匹配行。
从技术上讲,上述查询相当于(注意any关键字)

select *
  from travel_table
 where user_id = any (select myid from users where contact_id = v_contact_id);

相关问题