Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
Sql 我的记录中不断出现重复数据_Sql_List_Ms Access - Fatal编程技术网

Sql 我的记录中不断出现重复数据

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

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

最好使用real
join
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语法,而不是大量的括号;)