【问题标题】:select in select inner join在选择内连接中选择
【发布时间】:2017-03-14 10:39:09
【问题描述】:

我尝试在选择时进行内部连接。我的选择语句如下所示

SELECT con.fpd_no, 
       con.contract_no, 
        cm.cust_name, 
       (select cm.cust_name, TRIM(cm.address) || ', ' ||  TRIM(cm.zipcode) || ', ' || TRIM(klm.kelurahan_desc) || ', ' || TRIM(kcm.kecamatan_desc) || ', ' || TRIM(kbm.kabupaten_desc) || ', ' || TRIM(prm.propinsi_desc)
        from customer_master cm
        inner join kelurahan_master klm on klm.kelurahan_id=cm.kelurahan_id
        inner join kecamatan_master kcm on kcm.kecamatan_id=klm.kecamatan_id
        inner join kabupaten_master kbm on kbm.kabupaten_id=kcm.kabupaten_id
        inner join propinsi_master prm on prm.propinsi_id=kbm.propinsi_id;) as address, 
        con.principal_amount
   FROM contract con
   JOIN customer_master cm ON cm.cust_no = con.cust_no
   WHERE con.deal_code = 'A005'
    AND con.fpd_date BETWEEN '01-01-2016' AND '31-01-2016'
    AND con.fpd_no = '0103006116'
    AND con.objt_group = 'MOTOR';

但我收到此错误:

ORA-00911:无效字符。

【问题讨论】:

  • 您希望 SQL 如何在您的“地址”字段和表格之间建立链接?为什么不在后一个请求中与主表进行连接,并根据主选择中的表计算地址列,就像常规 SQL 语法一样?
  • ...prm.propinsi_id=kbm.propinsi_id;)... - 那个分号在那里做什么?去掉它;除了在 sql 语句的末尾之外,它没有其他位置。此外,con.fpd_date BETWEEN '01-01-2016' AND '31-01-2016':不要依赖隐式日期转换(假设 con.fpd_date 是 DATE 数据类型) - 而是使用 DATE 文字(例如DATE 2016-01-01)或to_date()(例如to_date('01/01/2016', 'dd/mm/yyyy'))。如果 con.fpd_date 包含午夜以外的时间,您将排除 2016 年 1 月 31 日午夜之后的数据。这是您想要的吗?

标签: sql oracle ora-00911


【解决方案1】:

试试这个:

删除子选择上的分号并确保选择只返回一行

SELECT con.fpd_no, con.contract_no, cm.cust_name, (select distinct cm.cust_name, TRIM(cm.address) || ', ' ||  TRIM(cm.zipcode) || ', ' || TRIM(klm.kelurahan_desc) || ', ' || TRIM(kcm.kecamatan_desc) || ', ' || TRIM(kbm.kabupaten_desc) || ', ' || TRIM(prm.propinsi_desc)
from customer_master cm
inner join kelurahan_master klm on klm.kelurahan_id=cm.kelurahan_id
inner join kecamatan_master kcm on kcm.kecamatan_id=klm.kecamatan_id
inner join kabupaten_master kbm on kbm.kabupaten_id=kcm.kabupaten_id
inner join propinsi_master prm on prm.propinsi_id=kbm.propinsi_id) as address, con.principal_amount
   FROM contract con
   JOIN customer_master cm ON cm.cust_no = con.cust_no
   WHERE con.deal_code = 'A005'
    AND con.fpd_date BETWEEN '01-01-2016' AND '31-01-2016'
    AND con.fpd_no = '0103006116'
    AND con.objt_group = 'MOTOR';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多