2010-10-08 4 views
1

В нижеследующем запросе запрашивается идентификатор wageTypeID на основе текущей активной записи и записи о зарплате.Simple INNER JOIN Query Returns No Value - Где я ошибаюсь?

SELECT wt.wageTypeID 
    FROM TimeSheet t 
    INNER JOIN Employee e ON e.employeeID = t.employeeID 
    INNER JOIN Salary s ON s.salaryID = t.salaryID 
    INNER JOIN Wage w ON w.wageID = s.wageID 
    INNER JOIN EmpHiringInfo ehf ON ehf.EmpHiringInfoID = s.EmpHiringInfoID 
    INNER JOIN WageType wt ON wt.wageTypeID = w.wageTypeID 
    WHERE ehf.employeeID = 300 
    AND ehf.isActive = 1 
    AND s.isActive = 1 

Вышеупомянутый запрос должен вернуть значение 15! Интересно, где я ошибся?


Вот схема соединяемых таблиц:

TimeSheet: 
timeSheetID 
employeeID - 300 
salaryID 
. 
. 

Salary: 
salaryID 
EmpHiringInfoID 
wageID 
isActive - true 
. 
. 

WageType: 
wageTypeID - 15 
wageTypeTitle - Hourly 

Wage: 
wageID 
wageTypeID - 15 
wageAmount - $11 


EmpHiringInfo: 
EmpHiringInfoID 
employeeID 
isActive - true 
. 
. 

IsActive в заработной плате только и правда только для одной записи. То же самое относится к EmpHiringInfo.

+1

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

ответ

2

Без фактического дампа данных (и операторов create table) мы не можем точно сказать, потому что мы не можем видеть ваши данные. Так вот, как подойти к ситуации, так что вы можете выяснить, где проблема:

  1. Масштаб обратно ЗЕЬЕСТ иметь не JOIN и - вы хотите, чтобы убедиться, что базовая таблица возвращает запись (ы) вам нужно прежде чем идти дальше.
  2. Добавьте СОЕДИНЕНИЕ, по одному за раз. Каждый JOIN, который вы добавляете, вам нужно проверить набор результатов, чтобы увидеть, что строки, которые вы ожидаете, все еще видны. Если JOIN имеет более одного критерия (IE: ehf), то снова - постепенно добавляйте критерии при проверке каждый раз.

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

Я рекомендую реструктурировать ваш запрос, чтобы использовать таблицу, в которой вы выбираете большинство данных из предложения FROM. В этом случае это означает:

SELECT wt.wageTypeID 
    FROM WAGETYPE wt 

Это облегчит добавление JOINs.

+0

Я нашел эту часть, причиняющую неприятности: И с.isActive = 1 –

+0

Если я удалю его, я получу 3 дубликаты записей, которые имеют значение 15 ... Я очень уверен, что активен в зарплате с установленным значением true, когда я добавляю s.isActive = 1, я должен получить сингл 15. –

+0

странно, когда я ставлю s.isActive, я не получаю никаких значений, и когда я удалю его, я получаю 3 дубликата. Во всяком случае, я попытаюсь это выяснить. –

5

Попробуйте прокомментировать одно соединение и посмотрите, если вы получите какие-либо результаты, если не закомментируйте другой и так далее, пока не увидите результаты. Последний, который вы прокомментировали, может дать вам понять, почему он провалился.

+0

Все объединенные таблицы необходимы. Если я прокомментирую один из них, весь запрос завершится неудачно. –

+0

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

+0

Я нашел эту часть, вызывая проблемы: AND s.isActive = 1 ... Если я удалю его, я получаю 3 дубликата записей, которые имеют значение 15 ... Я очень уверен, что активен в зарплате, установленном в true, когда я добавляю s .isActive = 1 я должен получить один 15 .... Странно, когда я ставлю s.isActive, я не получаю никаких значений, и когда я удалю его, я получаю 3 дубликата. Во всяком случае, я постараюсь выяснить это –

0

Перестройте выбор SQL-соединения за раз, начиная с EmpHiringInfo и Salary, так как это основные ссылки, указанные в предложении where.

2

Посмотрите на фактический план выполнения. Мышь над стрелками. Посмотрите, где количество строк, возвращаемых из JOIN, становится равным нулю.