【问题标题】:ORA-01789: query block has incorrect number of result columns?ORA-01789: 查询块的结果列数不正确?
【发布时间】:2020-10-14 17:11:19
【问题描述】:

我有这样的编码。有两个查询,我想使用 Union。但我收到错误“ORA-01789:查询块的结果列数不正确”。我的语法有什么问题吗?

  public function index()
    {
    $medias = DB::connection('oracle')
               ->table('ARCHIVE_LOG_SHEET_HDR AS a')
               ->selectRaw("a.MATERIAL_ID, 'SHOOT' as media_type, '' as media_format, b.HOUSE_NO, a.LOG_DATE, b.FILM_NAME, '' as episode_title, '' as episode_no, '' as last_tx, a.REMARKS, a.LOCATION_ID, c.REMARKS as REMARK_DTL")
               ->leftJoin('ARCHIVE_LOG_SHEET_PROG01 AS b', 'a.LOG_ID', '=', 'b.LOG_ID')
               ->leftJoin('ARCHIVE_LOG_SHEET_DTL AS c', 'a.LOG_ID', '=', 'c.LOG_ID');

   $materials = DB::connection('oracle')
              ->table("STOCK_MATERIAL AS x")
              ->select('x.MATERIAL_ID', 'y.HOUSE_NO', 'x.TXN_DATE', 'y.PROGRAM_NAME', 'w.EPI_NO', 'x.REMARKS', 'x.LOCATION_ID', 'z.remarks',
                       DB::raw("(SELECT TAPET_NAME FROM MA_TAPE_TYPE WHERE TAPET_CODE = x.MATERIAL_TYPE) as media_type"),
                       DB::raw("(SELECT TAPEF_NAME FROM MA_TAPE_FORMAT WHERE TAPEF_CODE = x.MATERIAL_FORMAT) as media_format"),
                       DB::raw("(SELECT MAX (last_date) FROM run_master WHERE run_master.row_id_epi = w.row_id AND run_master.run_aired = Y) as last_tx,"),
                       DB::raw('CASE WHEN x.iden_flag = P THEN y.epi_title WHEN x.iden_flag = C THEN y.prod_version_name WHEN x.iden_flag = M THEN y.promo_name END as episode_title'))
              ->leftJoin('STOCK_MATERIAL_EPI AS y', 'x.MATERIAL_ID', '=', 'y.MATERIAL_ID')
              ->leftJoin('stock_material_slag AS z', 'x.MATERIAL_ID', '=', 'z.MATERIAL_ID')
              ->leftJoin('PUR_EPISODE_HDR AS w', 'y.ROW_ID_EPI', '=', 'w.ROW_ID')
              ->union($medias)
              ->paginate(50);

     return view('ReceiveMedia.index', compact('medias', 'materials'));
 }

运行编码时出现错误 Error Code

查询 1

        SELECT
        ARCHIVE_LOG_SHEET_HDR.MATERIAL_ID as media_no,
        'SHOOT' as media_type,
        '' as media_format,
        ARCHIVE_LOG_SHEET_PROG01.HOUSE_NO as house_no,
        ARCHIVE_LOG_SHEET_HDR.LOG_DATE as entry_date,
        ARCHIVE_LOG_SHEET_PROG01.FILM_NAME as program_name,
        '' as episode_title,
        '' as episode_no,
        '' as last_tx,
        ARCHIVE_LOG_SHEET_HDR.REMARKS as remarks,
        ARCHIVE_LOG_SHEET_HDR.LOCATION_ID as shelf_no,
        ARCHIVE_LOG_SHEET_DTL.REMARKS as short_list
        FROM ARCHIVE_LOG_SHEET_HDR
        LEFT JOIN ARCHIVE_LOG_SHEET_PROG01 ON ARCHIVE_LOG_SHEET_HDR.LOG_ID = ARCHIVE_LOG_SHEET_PROG01.LOG_ID
        LEFT JOIN ARCHIVE_LOG_SHEET_DTL ON ARCHIVE_LOG_SHEET_HDR.LOG_ID = ARCHIVE_LOG_SHEET_DTL.LOG_ID

查询 2

        SELECT
        x.MATERIAL_ID,
        (SELECT TAPET_NAME FROM MA_TAPE_TYPE WHERE TAPET_CODE = x.MATERIAL_TYPE) as media_type,
        (SELECT TAPEF_NAME FROM MA_TAPE_FORMAT WHERE TAPEF_CODE = x.MATERIAL_FORMAT) as media_format,
        STOCK_MATERIAL_EPI.HOUSE_NO,
        x.TXN_DATE,
        STOCK_MATERIAL_EPI.PROGRAM_NAME,
        CASE WHEN x.iden_flag = 'P' THEN STOCK_MATERIAL_EPI.epi_title WHEN x.iden_flag = 'C'
        THEN STOCK_MATERIAL_EPI.prod_version_name WHEN x.iden_flag = 'M' THEN STOCK_MATERIAL_EPI.promo_name END as episode_title,
        PUR_EPISODE_HDR.EPI_NO,
        (SELECT MAX (last_date) FROM run_master WHERE run_master.row_id_epi = PUR_EPISODE_HDR.row_id AND run_master.run_aired = 'Y') as last_tx,
        x.REMARKS,
        x.LOCATION_ID as shelf_no,
        stock_material_slag.remarks as short_list
        FROM STOCK_MATERIAL x
        LEFT JOIN STOCK_MATERIAL_EPI ON x.MATERIAL_ID = STOCK_MATERIAL_EPI.MATERIAL_ID
        LEFT JOIN stock_material_slag ON x.MATERIAL_ID = stock_material_slag.MATERIAL_ID
        LEFT JOIN PUR_EPISODE_HDR ON STOCK_MATERIAL_EPI.ROW_ID_EPI = PUR_EPISODE_HDR.ROW_ID

【问题讨论】:

  • 由 UNION 或 UNION ALL 子句连接的查询没有相同数据类型的相同列数。即使列名相同,不同的数据类型也会给你下面的错误 Can you put only the SQL Query ?
  • 每个查询生成的列数与 12 列相同。
  • 列的数据类型是否相同??这也会产生错误
  • 我认为这两个查询已经具有相同类型的数据,因为我尝试在 SQL 开发人员中使用 UNION 命令运行这两个查询并且它运行良好。但是,当我遇到 Laravel 时仍然会收到错误

标签: laravel oracle eloquent laravel-query-builder


【解决方案1】:

屏幕截图显示 select count(*) ... 不存在于您的代码中。

但是,您在 laracasts.com 上发布了同样的问题并添加了一些代码,并且它确实包含 count() 函数调用。

简化,看起来像这样:

select count(*) as aggregate                 --> only 1 column
from stock_material x ...

union 

select a.material_id, 'SHOOT' as media_type  --> 12 columns
from stock_material ...

union

select a.material_id, 'SHOOT' as media_type  --> 12 columns
from archive_log_sheet_hdr ...

看到问题了吗?第一行?

也许你想说

select count(*) as aggregate 
from
  (select a.material_id, 'SHOOT' as media_type  --> 12 columns
     from stock_material ...
   union
   select a.material_id, 'SHOOT' as media_type  --> 12 columns
     from archive_log_sheet_hdr ...
  );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多