【问题标题】:Want to concatenate column of the second query to the first query but getting errors such as "query block has incorrect number of result columns"想要将第二个查询的列连接到第一个查询,但出现“查询块的结果列数不正确”等错误
【发布时间】:2020-11-14 17:07:32
【问题描述】:
SELECT
    ID, PRIM_EMAIL, SEC_EMAIL, PHONE 
FROM
    STUDENTS.RECORDS
WHERE 
    ID IN (SELECT ID FROM STUDENTS.INFO WHERE ROLL_NO = '554')

UNION

SELECT NAME 
FROM STUDENTS.INFO 
WHERE ROLL_NO = '554';

这里Roll_No 是用户插入的数据,所以现在我已经对其进行了硬编码。基本上在ROLL_NO 的帮助下,我对STUDENTS_INFO 表进行排序,从中我得到ID 并基于此我尝试从STUDENTS.RECORDS 表中获取PRIM_EMAILSEC_EMAILPHONE,同时匹配两个表的外键。除了当前的结果集,我还想要 prov_name 列。

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 一个UNION 的两个SELECTs 必须返回相同数量的列。
  • 您可以通过UNION select NAME, NULL, NULL, ... FROM ... 获得相同的号码。
  • Union 采用两个结果集并将它们组合在一起作为一个结果。这就像在 Excel 中复制和粘贴行。如果您想在结果中添加一个新列,您可以加入或使用子选择。
  • 更新您的问题添加适当的数据样本和预期结果

标签: sql database oracle join subquery


【解决方案1】:

我认为您的错误query block has incorrect number of result columns 的根源在于尝试将具有 4 列 (id, prim_email, sec_email, phone) 和 1 列 (name) 的表联合在一起。

根据您的问题,我收集到您想要来自students.recordsid, prim_email, sec_email, phone 和来自students.infoname 的单个表。

我认为以下使用 CTE 的查询可能会让您(部分)获得最终结果。您可能需要重构以优化性能。

with s_records as ( select * from students.records ),

s_info as ( select * from students.info ),

joined as ( 

  select
    s_records.id,
    s_records.prim_email,
    s_records.sec_email,
    s_records.phone,
    s_info.name

  from s_records

  left join s_info 
       on s_records.roll_no = s_info.roll_no

  where roll_np = '554' )

select * from joined

总的来说,我认为join 将成为您解决方案的一部分,而不是union :-)

【讨论】:

  • GMB 在没有 CTE 的情况下以更直接的方式做到这一点
【解决方案2】:

我怀疑您想将所有这些信息放在同一行,这表明join 而不是union all

select 
    r.ID,
    r.PRIM_EMAIL, 
    r.SEC_EMAIL,
    r.PHONE,
    r.NAME
from STUDENTS.RECORDS r
inner join STUDENTS.INFO i ON i.ID = r.ID
where I.ROLL_NO = '554';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 2013-11-01
    • 2018-03-20
    • 1970-01-01
    • 2021-01-11
    • 2017-02-09
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多