Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sqlplus中存在多个重复行_Oracle_Oracle11g_Oracle10g_Sqlplus - Fatal编程技术网

Oracle sqlplus中存在多个重复行

Oracle sqlplus中存在多个重复行,oracle,oracle11g,oracle10g,sqlplus,Oracle,Oracle11g,Oracle10g,Sqlplus,我正在使用Oracle10gDesigner和sqlplus开发一个数据库系统 我必须创建多个查询,大多数查询很简单,但有些查询存在一些问题 我这里有一个查询,当运行返回204行数据时,它实际上应该返回17行数据。这些行似乎重复了12倍。我不能把我的头缠在这上面;已经好几个小时了。我正在提交我的代码、查询的外观截图(scs表单)、ERD、结果截图和解释计划表输出。重复行是最后10列的结果 有人能帮忙吗 COLUMN C_FNAME FORMAT A10 COLUMN C_LNAME FORMAT

我正在使用Oracle10gDesigner和sqlplus开发一个数据库系统 我必须创建多个查询,大多数查询很简单,但有些查询存在一些问题

我这里有一个查询,当运行返回204行数据时,它实际上应该返回17行数据。这些行似乎重复了12倍。我不能把我的头缠在这上面;已经好几个小时了。我正在提交我的代码、查询的外观截图(scs表单)、ERD、结果截图和解释计划表输出。重复行是最后10列的结果

有人能帮忙吗

COLUMN C_FNAME FORMAT A10
COLUMN C_LNAME FORMAT A10
COLUMN C_ORG FORMAT A35
COLUMN C_ADR FORMAT A35
COLUMN C_CNUM FORMAT 9999999
COLUMN E_ID FORMAT A7
COLUMN E_NAME FORMAT A35
COLUMN E_FTIME FORMAT A21
COLUMN E_STIME FORMAT A21
COLUMN ET_DESC FORMAT 10
COLUMN V_NAME FORMAT A30
COLUMN V_ADDRESS FORMAT A35
COLUMN V_CNUM FORMAT 9999999
COLUMN D_DESC FORMAT A30
COLUMN D_AMT FORMAT A3
COLUMN ST_DESC FORMAT A15
COLUMN S_FNAME FORMAT A15
COLUMN S_LNAME FORMAT A15
COLUMN EQ_TYPE FORMAT A15
COLUMN EQ_DESC FORMAT A15
COLUMN EQ_AMT FORMAT A3
COLUMN SU_NAME FORMAT A40
BREAK ON C_FNAME ON C_LNAME ON C_ORG ON C_ADR ON C_CNUM ON E_ID ON E_NAME ON E_STIME ON E_FTIME ON ET_DESC ON V_NAME ON V_ADDRESS ON V_CNUM ON D_DESC ON D_AMT ON EQ_TYPE ON EQ_DESC ON EQ_AMT ON SU_NAME
SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM, D_DESC, D_AMT, ST_DESC, S_FNAME, S_LNAME, EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME
FROM CUSTOMER, EVENTTYPE, STAFFTYPE, VENUE, EVENT, STAFF, EVENT_DISHES, EVENT_EQUIPMENT, EVENT_STAFF, DISHES, EQUIPMENT, SUPPLIER
WHERE E_ID ='E000001'
AND CUSTOMER.C_ID = EVENT.C_C_ID
AND EVENTTYPE.ET_ID = EVENT.ET_ET_ID
AND VENUE.V_ID = EVENT.V_V_ID
AND EVENT_DISHES.E_E_ID = EVENT.E_ID
AND EVENT_DISHES.D_D_ID = DISHES.D_ID
AND EVENT_EQUIPMENT.E_E_ID = EVENT.E_ID
AND EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID
AND EQUIPMENT.SU_SU_ID = SUPPLIER.SU_ID
AND EVENT_STAFF.E_E_ID = EVENT.E_ID
AND EVENT_STAFF.S_S_ID = STAFF.S_ID
AND STAFF.ST_ST_ID = STAFFTYPE.ST_ID;


如果重新构造查询以使用ANSI兼容的联接语法,而不是WHERE子句中的=,可能会更容易

SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM, D_DESC, D_AMT, ST_DESC, S_FNAME, S_LNAME, EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME
FROM customer
INNER JOIN event ON CUSTOMER.C_ID = EVENT.C_C_ID
INNER JOIN eventtype ON EVENT.ET_ET_ID = EVENTTYPE.ET_ID
INNER JOIN venue ON EVENT.V_V_ID = VENUE.V_ID
INNER JOIN EVENT_DISHES ON EVENT.E_ID = EVENT_DISHES.E_E_ID
INNER JOIN DISHES ON DISHES.D_ID = EVENT_DISHES.D_D_ID
INNER JOIN EVENT_EQUIPMENT ON EVENT.E_ID = EVENT_EQUIPMENT.E_E_ID
INNER JOIN EQUIPMENT ON EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID
INNER JOIN SUPPLIER ON SUPPLIER.SU_ID = EQUIPMENT.SU_SU_ID
INNER JOIN EVENT_STAFF ON EVENT.E_ID = EVENT_STAFF.E_E_ID
INNER JOIN STAFF ON STAFF.S_ID = EVENT_STAFF.S_S_ID
INNER JOIN STAFFTYPE ON STAFFTYPE.ST_ID = STAFF.ST_ST_ID
WHERE E_ID ='E000001';
我正在调查您的数据不正确的原因,但这是一个开始


我认为在加入event_设备和供应商表时存在问题。该表中的数据是唯一的吗?

返回的204行是根据您的查询得到的正确数量。 您有17名员工个人(其中类型仅派生自)。这17行乘以2个盘子,再乘以2个租用设备和4个所需设备(2+4=6)。17*2*6给出了204行

这是因为,例如,查询EVENT_disks以使用与给定的e_ID匹配的结果填充17个现有行,并每次返回2个d_d_ID

我认为您的目标是创建以编程方式提供的表单。要实现这一点,您需要查询数据库四次。一次用于活动本身,一次用于餐具,一次用于设备,一次用于与活动相关的工作人员

SELECT C_FNAME, C_LNAME, C_ORG, C_ADR, C_CNUM, E_ID, E_NAME, E_FTIME, E_STIME, ET_DESC, V_NAME, V_ADDRESS, V_CNUM
FROM event
INNER JOIN customer ON EVENT.C_C_ID = CUSTOMER.C_ID
INNER JOIN eventtype ON EVENT.ET_ET_ID = EVENTTYPE.ET_ID
INNER JOIN venue ON EVENT.V_V_ID = VENUE.V_ID
WHERE E_ID ='E000001';

SELECT D_DESC, D_AMT
FROM EVENT_DISHES
INNER JOIN DISHES ON DISHES.D_ID = EVENT_DISHES.D_D_ID
WHERE E_E_ID ='E000001';

SELECT EQ_TYPE, EQ_DESC, EQ_AMT, SU_NAME
FROM EVENT_EQUIPMENT
INNER JOIN EQUIPMENT ON EVENT_EQUIPMENT.EQ_EQ_ID = EQUIPMENT.EQ_ID
INNER JOIN SUPPLIER ON SUPPLIER.SU_ID = EQUIPMENT.SU_SU_ID
WHERE E_E_ID ='E000001';

SELECT ST_DESC, S_FNAME, S_LNAME
FROM EVENT_STAFF
INNER JOIN STAFF ON STAFF.S_ID = EVENT_STAFF.S_S_ID
INNER JOIN STAFFTYPE ON STAFFTYPE.ST_ID = STAFF.ST_ST_ID
WHERE E_E_ID ='E000001';

我希望所有字段都与相应的查询正确匹配。根据需要进行修改。

我对sqlplus相当陌生。我一直在学习,你能提供一个执行计划吗?尝试执行“explain plan for”,然后在完成后执行“select*from table(dbms_xplan.display);”。将输出添加到您的问题中。祝您愉快。谢谢你的回复。我已经添加了请求的信息Good day先生我尝试了您的解决方案,结果与返回的204行相同。独特的?event_equipment表包含每个事件的ID、每个设备的ID以及每个事件使用的设备数量。这种方法还避免了由于(隐式)内部联接而导致的事件显示之前必须存在每个组件的需要。非常感谢先生,这很有帮助