sqlplus中的多个重复行

Multiple duplicate rows in sqlplus

我正在使用 oracle 10g designer 和 sqlplus 开发数据库系统 我必须创建多个查询,大多数查询都很简单,但有些我遇到了一些问题。

我在这里有一个查询,当运行 returns 204 行数据时,实际上应该返回 17 行数据。这些行似乎重复了 12 次。我不能全神贯注于此;已经好几个小时了。我正在提交我的代码、查询应该如何显示的屏幕截图(scs 表单)、我的 ERD、结果的屏幕截图和解释计划 table 输出。重复的行是最后 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_equipment 和供应商 table 的连接存在问题。 table 中的数据是否唯一?

返回的 204 行是您的查询产生的正确金额。 您有 17 名员工(类型仅源自)。这 17 行乘以 2 个盘子并乘以 2 个雇用和 4 个所需 (2+4 = 6) 设备。所以 17 * 2 * 6 给你 204 行。

这是因为例如EVENT_DISHES 被查询以填充 17 个现有行,结果每次都与给定的 E_ID 和 returns 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';

我希望我将所有字段正确匹配到相应的查询。根据需要修改。