2014-08-27 3 views
0

Я использую доступ к MS.Я продолжаю получать повторяющиеся данные в своей записи

Я попытался написать SQL код, обратитесь к таблицам EMPLOYEE, PROJECT и задания и возврата результатов, как показано на рисунке ниже:

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 
+1

Насколько я могу сказать, вы не должны иметь каких-либо строк. Вы уверены, что это ваш код? Возможно, дублирование связано с отсутствием предложений о вашем соединении. –

+0

Извините, неправильный код – 2h2h2h

+2

[Плохие привычки пинать: использование старинного JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old- style-joins.aspx) - этот старый стиль * разделенный запятыми список таблиц * style должен ** больше не использоваться **, и вместо этого рекомендуется использовать ** соответствующий ANSI JOIN ** синтаксис, введенный с ANSI- ** 92 ** Стандарт SQL (более ** 20 лет ** назад) –

ответ

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; 

Имена полей, которые я использовал на основе текущего запроса. Я надеюсь, что есть некоторые поля идентификаторов, которые вы могли бы использовать вместо этого.

Предпочтительно использовать реальные 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; 
+0

Uhm Я знаю, что я ноб, но что такое Project p, является ли это атрибутом в таблице проектов? – 2h2h2h

+0

'p' является псевдонимом для' project'. Это делает ваш код более читабельным и будет способствовать повышению производительности. –

+0

p является псевдонимом для ссылки на таблицу проекта – CodeNewbie

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 соединений.

+0

Да, ты прав. Некоторое преувеличивание с моей стороны. Отредактировал его. – CodeNewbie

-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; 
+0

Он сказал, что есть много JOB_CODE, что мне нужно сделать сейчас. Мой JOB_CODE - это мой ПК в таблице JOB. – 2h2h2h

+3

Не поощряйте использование синтаксиса pre-ansi 92 join! – Zane

+2

@ Zane, но что, если я *** как *** случайные декартовы продукты? – swasheck

0

Не видя фактический дубликат данных вы получаете или структуру таблиц, то трудно ответить ... но я предполагаю, что это потому, что вы не ограничивая присоединяется таблицы ...

Такие, как

SELECT * 
FROM EMPLOYEE e 
JOIN Job j on j.JobID = e.JobID 
JOIN Project p on p.ProjectID = e.ProjectID (or j.ProjectID?) 

вы должны ограничить данные вторичных таблиц возвращаются ... как вы едите сейчас, вторичные таблицы будут возвращать все.

Внешний или внутреннее соединение используется в зависимости от того, как вы их связали вместе ...

Смежные вопросы