2012-06-29 2 views
0

Удивление, если кто-то может объяснить разницу между этими двумя запросами и сообщить, почему один работает, а другой нет.SELECT DISTINCT. Пожалуйста, объясни?

Этот продукт работает. Дает мне две записи отдельного значения GantryRtn и их соответствующее значение SSD.

SELECT DISTINCT GantryRtn as Gantry, ROUND(Field.SSD,1) as SSD 
      FROM Field, PlanSetup, Course, Patient, Radiation 
        WHERE Field.RadiationSer=Radiation.RadiationSer 
         AND Radiation.PlanSetupSer=PlanSetup.PlanSetupSer 
         AND PlanSetup.CourseSer=Course.CourseSer 
         AND Course.PatientSer=Patient.PatientSer 
         AND Patient.PatientId='ZZZ456' 
         AND PlanSetup.PlanSetupId='F T1 R CHEST' 

Однако есть внешний ключ в полей таблицы, ссылки на первичный ключ другой таблицы, которая содержит простое текстовое имя для каждого поля. Я также хотел бы извлечь это имя (в отдельном запросе, если нужно), вытащив этот внешний ключ RadiationSer. Но как только я положил RadiationSer в запрос, я теряю результат DISTINCT.

SELECT DISTINCT GantryRtn as Gantry, ROUND(Field.SSD,1) as SSD, Field.RadiationSer 
      FROM Field, PlanSetup, Course, Patient, Radiation 
        WHERE Field.RadiationSer=Radiation.RadiationSer 
         AND Radiation.PlanSetupSer=PlanSetup.PlanSetupSer 
         AND PlanSetup.CourseSer=Course.CourseSer 
         AND Course.PatientSer=Patient.PatientSer 
         AND Patient.PatientId='ZZZ456' 
         AND PlanSetup.PlanSetupId='F T1 R CHEST' 

Этот второй запрос дает мне 7 записей без различных GantryRtn значений.

Почему это происходит?

Я исследовал использование GROUP BY, но это замедляет запрос вниз и, как представляется, вытаскивает ВСЕ GantryRtn из базы данных (100 записей).

Благодаря Грег

+0

Возможный дубликат [Выбрать отдельно от нескольких полей с использованием sql] (http://stackoverflow.com/q/546804/), [sql-запрос, отличный от нескольких столбцов] (http://stackoverflow.com/q/1503080 /), [DISTINCT в нескольких столбцах] (http://stackoverflow.com/q/5804529/) – outis

+0

Привет, спасибо, но я не понимаю, почему эти запросы (и мой первый) работают, но мой второй не работает, т. Я уже выбираю несколько столбцов с одним DISTINCT в моем первом запросе. Я хочу понять, почему добавление другого столбца приводит к сбою DISTINCT? Поэтому вопрос: «Почему он не работает?» а не «Как мне сделать эту работу?» – Barbs

ответ

3

отчетливое ключевое слово в своей работе применяет результирующий набор (все поля), а не только к первому полю.

В вашем случае:

SELECT DISTINCT GantryRtn as Gantry, ROUND(Field.SSD,1) as SSD, Field.RadiationSer 

возвратит все записи, которые отличаются (не то же самое), взятого вместе с Gantry, SSD, and RadiationSer

Итак, вы можете иметь 7 записей для одной и той же Gantry и с различными значения для RadiationSer.

Если вы хотите, чтобы первый фильтр отличался от Gantry значений, вы можете выполнить это с помощью суб-запроса и внутреннего соединения, но каким-то образом вы должны установить, на каком значении использовать RadiationSer.

+0

Спасибо за ваш ответ Мики. Хорошо, поэтому я думаю, что теперь понимаю, как я неверно истолковываю ключевое слово DISTINCT. _RadiationSer_ - это уникальное значение, присвоенное каждому _Field_, поэтому, если имеется 7 полей, есть 7 RadiationSers. Я хочу выделить те RadiationSer, которые имеют разные значения _GantryRtn_ и сообщают SSD для этих уникальных полей. Я потрачу некоторое время на это и опубликую в отдельном вопросе, если я буду пытаться построить для него код. – Barbs

+0

Решено около 5 строк PHP. Спасибо за вашу помощь. :) – Barbs