我一直在记录中获取重复数据

时间:2014-08-27 14:20:41

标签: sql list ms-access

我正在使用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

4 个答案:

答案 0 :(得分:3)

您缺少连接的条件。现在,employeejob都会提供所有记录。你必须告诉它们与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;