Intereting Posts
Oracle конвертирует строки в столбцы Почему этот поисковый запрос HQL не работает? Как удалить повторяющиеся значения столбца из отчета MySQL, объединяющий COUNT, MAX и SUM Медленный запрос при сравнении геометрий обновление строк вместо создания новых записей базы данных android Вставить счет в точный онлайн SQLAlchemy: создать запрос на удаление с помощью самообучения в MySQL Entity Framework и Predicate Builder – Предикаты игнорируются в запросе SQL Использование связанного сервера возвращает ошибку – «Не удается получить набор строк схемы для поставщика OLE DB» Можем ли мы написать вспомогательную функцию или процедуру внутри другой хранимой процедуры – SQL Server SQL – запрос, чтобы узнать, содержит ли строка значение в столбце SQL для проверки всех значений в столбце Более быстрый способ вставки через скрипт в Oracle? Почему не удается создать глобальную временную таблицу или усечь ее при вызове хранимой процедуры из кода C #?

Как подключиться к третьей таблице в моей инструкции SQL, которая возвращает COUNT, не теряя 0 счетчиков?

Продолжение этого вопроса Мне нужен оператор SQL, который возвращает числовые строки в таблице с определенным значением.

Мы остановились на инструкции SQL следующим образом …

SELECT t.teamid, t.teamname, COALESCE(COUNT(p.playerid), 0) AS playercount, t.rosterspots FROM TEAMS t LEFT JOIN PLAYERS p ON p.teamid = t.teamid GROUP BY t.teamid, t.teamname, t.rosterspots 

У меня есть еще одно ограничение для добавления. ЧТО ЕСЛИ, игроки должны пройти медицинский экзамен, прежде чем рассчитывать на «плей-офф»?

Я представлю таблицу.

 Медицинские анализы
 PlayerId PassedMedical
 1 1
 2 0
 3 1
 4 1

Где «PassedMedical» бит (1 = true).

А также добавьте еще 1 ROW данных в таблицу команд.

 Имя команды TeamId
 3 Торонто

Таким образом, у меня есть команда с 0 игроками.

И ожидаемое значение OUTPUT изменится на:

 Название команды PlayerCount
 Miami Heat 2
 Нью-Йорк Никс 1
 Торонто Rapters 0

так как один из игроков Miami Heat еще не прошел медицинский осмотр.

Если я добавлю

 LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId WHERE m.PassedMedical = 1 

В приведенном выше заявлении я теряю все строки «0»?

Благодаря,
Джастин

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

 SELECT t.teamid, t.teamname, (SELECT COUNT(*) FROM players inner join medicaltests on players.playerid = medicaltests.playerid where players.teamid = t.teamid and medicaltests.passedmedical = 1) AS playercount, t.rosterspots FROM TEAMS t GROUP BY t.teamid, t.teamname, t.rosterspots 
 LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId WHERE m.PassedMedical = 1 

Это противоречиво. Вы говорите, что это левое соединение, поэтому запись MEDICALTESTS не обязательно существует, но тогда говорят, что запись должна существовать и иметь 1 как PassedMedical. Таким образом, ваше левое соединение становится внутренним соединением на самом деле, а также, поскольку у вас должна быть строка MEDICALTESTS, у вас также должна быть строка PLAYERS, так что она также становится внутренним соединением.

Попробуйте это вместо этого:

 INNER JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId and m.PassedMedical = 1 

Не знаете, как SQL-сервер интерпретирует FROM foo LEFT JOIN bar INNER JOIN baz … вы хотите, чтобы он интерпретировал это как FROM foo LEFT JOIN (bar INNER JOIN baz). Если это не работает, вместо этого используйте подзапрос; не присоединяйтесь, просто добавьте:

 WHERE p.PlayerId IS NULL or (select PassedMedical from MEDICALTESTS m where m.PlayerId=p.PlayerID) = 1 

Надеюсь, это поможет, несмотря на то, что я не знаком с SQL Server.

Почему бы не сделать это как вычисленный столбец?

 SELECT t.teamid, t.teamname, (SELECT COUNT(*) FROM MEDICALTESTS m WHERE p.PlayerId = m.PlayerId and m.PassedMedical = 1 ) AS PassedMedicalCount 

Прочтите это, чтобы понять проблему, с которой вы сталкиваетесь: http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

В основном, поставив условие в clasue, вы конвертируете левое соединение в внутреннее соединение. Попробуйте это вместо этого:

 LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId and m.PassedMedical = 1