2016-02-10 2 views
0

У меня возникли проблемы с этим оператором SQL. Я пытаюсь ограничить результаты игроками с идентификаторами «25» и «87». В запросе нет ошибки (я получаю каждый PID с этим запросом) Это утверждение.SQL Присоединиться к оператору «И» + «ИЛИ»

SELECT Rosters.PID, SUM(Rosters.Goals) Goals, SUM(Rosters.Assists) Assists, SUM(Rosters.PIM) PIM, Rosters.TID, Players.pid, Players.firstname, Players.lastname, 
     SUM((Rosters.Goals + Rosters.Assists)) AS Points, Teams.tid, Teams.teamname 
     FROM Rosters 
     INNER JOIN Players 
     ON Rosters.PID = Players.pid 
     INNER JOIN Teams 
     ON Rosters.TID = Teams.tid 
     WHERE ((Rosters.TID BETWEEN 9 AND 16) AND (Players.pid = 25 OR 87)) 
     GROUP BY 
     Players.pid 
     ORDER BY Points DESC 

Я почти уверен, что это является причиной моего отсутствия SQL понимания, но W3C школы не предлагают более сложных решений и тему Stack Я посмотрел вверх, был довольно локализован.

Here is the current output. It should just be the players with Id's 25 and 87

ответ

3

У вас ошибка в состоянии вокруг Players.pid.

Это должно быть

(Players.pid = 25 OR Players.pid = 87) 

Логическое OR оператор объединяет два логических условия. Players.pid = 25 действительное условие, оно оценивается как boolean true или false. Но 87 определенно не оценивает значение boolean.

+0

Спасибо. Это было легко исправить! Есть ли какой-либо экземпляр, когда вам не нужно повторно указывать имя таблицы или имя столбца в такой ситуации? –

+0

@ KurtLeadley Частично. Вы можете избавиться от полных имен таблиц, используя псевдонимы таблиц типа 'FROM Rosters as R' и т. Д. Таким образом, вы сможете использовать 'R.column_name' вместо' Rosters.column_name' в своем запросе. –

+0

Да, я делал это (вроде) в начале моего запроса. Я просто не совсем понимаю, когда вам нужно объявить и не объявлять имена таблиц и столбцов. Этот 2-хклассный класс SQL не сделал для меня достаточно ха-ха! –

2

Просто измените часть вашего кода из Players.pid = 25 OR 87 Чтобы Players.pid = 25 OR Players.pid = 87

+0

Спасибо. Энди победил тебя, но я все еще голосовал за тебя. Есть ли какая-то особая причина, почему 'Rosters.TID BETWEEN 9 AND 16' в порядке, но не' Players.pid = 25 OR 87'. Я предполагаю, потому что оператор предложения BETWEEN всегда имеет 2 аргумента? –

+0

Оператор @KurtLeadley 'Between' не объединяет логические операторы, это отдельный оператор, имеющий синтаксис' BETWEEN begin_expression AND end_expression'. В этом случае 'AND', который вы видите, не имеет ничего общего с объединением логических выражений, это часть синтаксиса' между '. –

+0

Хорошо, я понимаю. Вот что я понял после того, как вы ответили на мой вопрос –

1

в качестве альтернативы вы можете использовать в конструкции, чтобы соответствовать Players.pid против списка возможных значений (обратите внимание, что внешние скобки не нужны):

WHERE Players.pid IN (25, 87) AND Rosters.TID BETWEEN 9 AND 16 
1

Кроме того, если вы думаете, Players.pid увеличится, чтобы проверить состояние можно использовать в работе и использовать как этот

AND Players.pid IN (25,87) // You can add here more id to check 

Вместо вашего кода

AND (Players.pid = 25 OR 87) 
Смежные вопросы