Sql 我的记录中不断出现重复数据
我正在使用MS access 我尝试编写SQL代码来引用EMPLOYEE、PROJECT和JOB表,并返回结果,如下图所示:Sql 我的记录中不断出现重复数据,sql,list,ms-access,Sql,List,Ms Access,我正在使用MS access 我尝试编写SQL代码来引用EMPLOYEE、PROJECT和JOB表,并返回结果,如下图所示: 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 ELECT
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
您缺少联接的条件。现在
employee
和job
都给出了所有记录。您必须说明它们与项目
表的关系
大概是这样的:
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;
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;
我使用的字段名基于您当前的查询。我希望您可以使用一些ID字段
最好使用realjoin
s:
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;
您已经创建了笛卡尔积(或交叉联接)。得到的值不仅是重复的,而且是错误的。为了避免这种情况,您需要在查询中使用联接
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;
查看有关使用SQL联接的详细信息。您在三个表上使用联接: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;
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;
如果看不到您正在接收的实际重复数据或表的结构,则很难回答。。。但我认为这是因为您没有限制表的联接 比如
SELECT *
FROM EMPLOYEE e
JOIN Job j on j.JobID = e.JobID
JOIN Project p on p.ProjectID = e.ProjectID (or j.ProjectID?)
您需要限制辅助表返回的数据。。。现在,辅助表将返回所有
外部连接或内部连接的使用取决于它们的连接方式…据我所知,您不应该有任何行。你确定这都是你的代码吗?重复可能是由于join中缺少子句造成的。-旧样式的逗号分隔表列表样式不应再使用,而是建议使用ANSI-92 SQL标准(20多年前)引入的正确ANSI JOIN语法@2h2h2h我认为Patrick不是说你需要写出所有列,但是您的连接语法缺少连接上的ON子句。您能举几个结果行的例子吗?因为您的查询不包含联接条件,所以在表之间计算笛卡尔积。是的,您是对的。我的一些预先假设。我知道我是noob,但是什么是项目p,它是项目表中的一个属性吗?
p
是Project
的别名。它使你的代码更具可读性,也有助于提高性能。p是指项目表的别名。它说有两个作业代码,我现在需要做什么。我的作业代码是我在作业表中的主键。@2H2H:请参阅更新。select中的字段本身是不明确的,因此您也可以使用别名来解决这个问题。它说有许多作业代码,我现在需要做什么。我的JOB_代码是我在JOB表中的主键。不要鼓励使用pre-ansi 92 join语法@Zane但如果我喜欢随机笛卡尔产品呢?@Zane我认为stackoverflow.com是指向该网站的别名,但@Zane似乎是一个合理的建议。访问。我更喜欢ANSI-89语法,而不是大量的括号;)