【发布时间】: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