Простой INNER JOIN Запрос не возвращает значения - где я ошибся? - PullRequest
1 голос
/ 08 октября 2010

Приведенный ниже запрос извлекает wageTypeID на основе текущей активной информационной записи найма и записи о зарплате.

  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 в Salary - это только и только True для одной записи. То же самое относится и к EmpHiringInfo.

Ответы [ 4 ]

5 голосов
/ 08 октября 2010

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

2 голосов
/ 08 октября 2010

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

2 голосов
/ 08 октября 2010

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

  1. Уменьшите оператор SELECT, чтобы не было JOIN - вы хотите убедиться, что базовая таблица возвращает запись (ы).) вам нужно, прежде чем идти дальше.
  2. Добавьте JOIN, по одному за раз.При каждом добавлении JOIN необходимо проверять набор результатов, чтобы убедиться, что ожидаемые строки все еще видны.Если JOIN имеет более одного критерия (IE: ehf), то снова - постепенно добавляйте критерии при проверке каждый раз.

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

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

SELECT wt.wageTypeID
  FROM WAGETYPE wt

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

0 голосов
/ 08 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...