我正在使用MS访问。
我尝试编写引用表EMPLOYEE,PROJECT和JOB的SQL代码并返回结果,如下图所示:
PROJ_NAME PROJ_VALUE PROJ_BALANCE EMP-LNAME EMP_FNAME EMP_INITIAL JOB_CODE JOB_DESCRIPTION JOB_CHG_HOUR
iCEBUTT 800.00 12000 SMITH ANNE E 12 ELECTRIC ENGENEER 10
FIREBUTT 810.00 20000 SHEMAN ANNE G 15 WATER ENGENEER 12
iCEBTEA 802.00 10000 SIMPSON ANNE H 11 NON ENGENEER 11
iCECUBE 890.00 18000 SMITFIELD ANNE A 19 ELECTRIC ENGENEER 9.5
我的代码
SELECT PROJ_NAME, PROJ_VALUE, PROJ_BALANCE, EMP_LNAME, EMP_FNAME, EMP_INITIAL, JOB_CODE, JOB_DESCRIPTION, JOB_CHG_HOUR
FROM EMPLOYEE, JOB, PROJECT
WHERE PROJ_VALUE >= 10000;
我从代码中得到的是很多重复的数据。 我的结果:
PROJ_NAME PROJ_VALUE PROJ_BALANCE EMP-LNAME EMP_FNAME EMP_INITIAL JOB_CODE JOB_DESCRIPTION JOB_CHG_HOUR
iCEBUTT 800.00 12000 SMITH ANNE E 12 ELECTRIC ENGENEER 10
iCEBUTT 800.00 12000 SMITH ANNE E 12 ELECTRIC ENGENEER 10
iCEBUTT 800.00 12000 SMITH ANNE E 12 ELECTRIC ENGENEER 10
iCEBUTT 800.00 12000 SMITH ANNE E 12 ELECTRIC ENGENEER 10
FIREBUTT 810.00 20000 SHEMAN ANNE G 15 WATER ENGENEER 12
FIREBUTT 810.00 20000 SHEMAN ANNE G 15 WATER ENGENEER 12
FIREBUTT 810.00 20000 SHEMAN ANNE G 15 WATER ENGENEER 12
FIREBUTT 810.00 20000 SHEMAN ANNE G 15 WATER ENGENEER 12
iCEBTEA 802.00 10000 SIMPSON ANNE H 11 NON ENGENEER 11
iCEBTEA 802.00 10000 SIMPSON ANNE H 11 NON ENGENEER 11
iCEBTEA 802.00 10000 SIMPSON ANNE H 11 NON ENGENEER 11
iCECUBE 890.00 18000 SMITFIELD ANNE A 19 ELECTRIC ENGENEER 9.5
iCECUBE 890.00 18000 SMITFIELD ANNE A 19 ELECTRIC ENGENEER 9.5
iCECUBE 890.00 18000 SMITFIELD ANNE A 19 ELECTRIC ENGENEER 9.5
答案 0 :(得分:3)
您缺少连接的条件。现在,employee
和job
都会提供所有记录。你必须告诉它们与project
表的关系。
这样的事情:
SELECT p.PROJ_NAME, p.PROJ_VALUE, p.PROJ_BALANCE, p.EMP_LNAME, p.EMP_FNAME, p.EMP_INITIAL, p.JOB_CODE, p.JOB_DESCRIPTION, p.JOB_CHG_HOUR
FROM EMPLOYEE e, JOB j, PROJECT p
WHERE p.job_code = j.job_code /*enter correct fields here*/
AND p.emp_name = e.emp_name /*enter correct fields here*/
AND p.PROJ_VALUE >= 805000.00;
我使用的字段名称基于您当前的查询。我希望你可以使用一些ID字段。
最好使用真实的join
:
SELECT p.PROJ_NAME, p.PROJ_VALUE, p.PROJ_BALANCE, p.EMP_LNAME, p.EMP_FNAME, p.EMP_INITIAL, p.JOB_CODE, p.JOB_DESCRIPTION, p.JOB_CHG_HOUR
FROM PROJECT p
JOIN JOB j
ON p.job_code = j.job_code /*enter correct fields here*/
JOIN EMPLOYEE e
ON p.emp_name = e.emp_name /*enter correct fields here*/
WHERE p.PROJ_VALUE >= 805000.00;
答案 1 :(得分:0)
您已创建笛卡尔积(或交叉连接)。获得的价值不仅是重复的,而且是错误的。为避免这种情况,您需要在查询中使用联接。
SELECT *
FROM EMPLOYEE
JOIN JOB ON EMPLOYEE.JOB_ID = JOB.ID
JOIN PROJECT ON EMPLOYEE.PROJ_ID = PROJECT.ID
WHERE PROJECT.PROJ_VALUE >= 805000.00;
检查this tutorial以获得有关使用SQL连接的一些见解。
答案 2 :(得分:0)
如果没有看到您正在接收的实际重复数据或表的结构,则很难回答......但我认为这是因为您不限制表的连接...
如
SELECT *
FROM EMPLOYEE e
JOIN Job j on j.JobID = e.JobID
JOIN Project p on p.ProjectID = e.ProjectID (or j.ProjectID?)
您需要限制辅助表返回的数据...正如您现在所拥有的那样,辅助表将全部返回。
使用外部或内部连接取决于您将它们绑在一起的方式......
答案 3 :(得分:-3)
您正在三个表上使用联接:Employee,Job和Project,但不添加任何连接条件。这会产生重复。考虑添加这样的条件:
SELECT PROJ_NAME, PROJ_VALUE, PROJ_BALANCE, EMP_LNAME, EMP_FNAME, EMP_INITIAL, JOB_CODE, JOB_DESCRIPTION, JOB_CHG_HOUR
FROM EMPLOYEE, JOB, PROJECT
WHERE PROJ_VALUE >= 805000.00
AND JOB.EMPLOYEE_ID=EMPLOYEE.ID
AND PROJECT.JOB_ID = JOB.ID;