От MySQL к MS SQL все столбцы недействительны?

У меня есть следующий запрос, который отлично выполняется в MySQL, но он вызывает у меня проблемы, когда я выполняю его на MS SQL Server:

SELECT failedlogins.*, siteprofiles.failedLogins AS max,
   COUNT(failedlogins.id) AS total
FROM failedlogins RIGHT JOIN siteprofiles ON failedlogins > 0
WHERE computerName LIKE 'some awesome name' AND timeStamp > 1340752043
GROUP BY computerName

Я получаю следующие ошибки:

Msg 8120, Level 16, State 1, Line 2
Column 'failedlogins.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 2
Column 'failedlogins.timeStamp' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 2
Column 'failedlogins.userName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120, Level 16, State 1, Line 2
Column 'siteprofiles.failedLogins' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Я думаю, что это как-то связано с RIGHT JOIN, но я не знаю, как это решить.

В качестве примечания: если вы не знакомы с MySQL, я правильно присоединил единственную строку из siteprofiles к таблице failedlogins. Обычно вы видите знак =, чтобы поставить отметку "Нравится" две строки из нескольких таблиц. В MySQL, если вы выбираете только одну строку для присоединения к таблице и не используете оператор равенства для связывания строк вместе, он присоединит строку к каждой возвращаемой строке.

Может ли кто-нибудь помочь мне отладить приведенное выше утверждение?


РЕДАКТИРОВАТЬ:

Вот SQL, который строит таблицу failedlogins:

CREATE TABLE failedlogins (
  "id" int NOT NULL,
  "timeStamp" int NOT NULL,
  "computerName" NTEXT NOT NULL,
  "userName" NTEXT NOT NULL,
  PRIMARY KEY ("id")
) ;

и таблица siteprofiles:

CREATE TABLE siteprofiles (
  "id" int NOT NULL,
  "siteName" varchar(200) NOT NULL,
  "paddingTop" tinyint NOT NULL,
  "paddingLeft" tinyint NOT NULL,
  "paddingRight" tinyint NOT NULL,
  "paddingBottom" tinyint NOT NULL,
  "width" int NOT NULL,
  "height" int NOT NULL,
  "sideBar" text NOT NULL,
  "auto" text NOT NULL,
  "siteFooter" text NOT NULL,
  "author" varchar(200) NOT NULL,
  "language" varchar(15) NOT NULL,
  "copyright" varchar(200) NOT NULL,
  "description" NTEXT NOT NULL,
  "meta" text NOT NULL,
  "timeZone" varchar(20) NOT NULL,
  "welcome" text NOT NULL,
  "style" varchar(200) NOT NULL,
  "iconType" text NOT NULL,
  "spellCheckerAPI" varchar(50) NOT NULL,
  "saptcha" text NOT NULL,
  "question" NTEXT NOT NULL,
  "answer" NTEXT NOT NULL,
  "failedLogins" int NOT NULL,
  PRIMARY KEY ("siteName")
);

INSERT INTO siteprofiles (id, siteName, paddingTop, paddingLeft, paddingRight, paddingBottom, width, height, sideBar, auto, siteFooter, author, language, copyright, description, meta, timeZone, welcome, style, iconType, spellCheckerAPI, saptcha, question, answer, failedLogins) VALUES
(1, 'The Bell News Magazine', 0, 0, 0, 0, 260, 180, 'Right', '', '<p>&copy; 2011 The Bell News Magazine</p>', 'The Bell News Magazine', 'en-US', '© 2011 The Bell News Magazine', 'The collaborative, innovative Bell News Magazine', 'The Bell News Magazine, The PAVCS Bell News Magazine, The Pennsylvania Virtual Charter School Bell News Magazine, Pennsylvania Virtual Charter School Bell News Magazine, Bell News Magazine, Bell News, Bell Magazine, The Bell Magazine, The Bell News', 'America/New_York', 'Ads', 'onlineUniversity.css', 'gif', 'jmyppg6c5k5ajtqcra7u4eql4l864mps48auuqliy3cccqrb6b', 'auto', '', '', 5);

Спасибо за уделенное время.


person Oliver Spryn    schedule 28.06.2012    source источник
comment
ON failedlogins - неполное состояние   -  person zerkms    schedule 28.06.2012


Ответы (3)


Похоже, вы редактировали вопрос с момента получения первых ответов. Ошибки на дудку

Столбец failedlogins.id недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

... связаны с тем, что, хотя MySQL (в своей конфигурации по умолчанию) очень снисходительно относится к содержимому GROUP BY, другие СУБД - нет. Чтобы получить все остальные столбцы из failedlogins.*, вам нужно JOIN против подзапроса, который производит подсчет только в соответствующем столбце группы.

SELECT
  failedlogins.*, 
  siteprofiles.failedlogins AS max,
  logincount
FROM 
  failedlogins RIGHT JOIN siteprofiles ON failedlogins > 0
  /* Join matches remaining columns to the counts of computerName */
  INNER JOIN (
    /* Subquery gets computerName and count to join against */
    SELECT computerName, COUNT(*) logincount FROM failedlogins GROUP BY computerName
  ) logincounter ON failedlogins.computerName LIKE logincounter.computerName
WHERE failedlogins.computerName LIKE 'some awesome name' AND timeStamp > 1340752043
person Michael Berkowski    schedule 28.06.2012
comment
Хм ... Получаю вот что: Msg 306, Level 16, State 2, Line 1 The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator. - person Oliver Spryn; 28.06.2012
comment
@ spryno724 В каком столбце находится капля текста или изображения? - person Michael Berkowski; 28.06.2012
comment
Я обновил свой вопрос. И по какой-то причине я больше не могу отмечать твое имя в этих комментариях - person Oliver Spryn; 28.06.2012
comment
@ spryno724 А, значит failedLogins.computerName это ntext, и мы присоединяемся к этому с =. Попробуйте изменить предложение ON на ON failedlogins.computerName LIKE logincounter.computerName. Есть ли причина, по которой столбец должен быть ntext? Неужели так долго, что это не может быть варчар? Если вы можете его изменить, я бы рекомендовал вместо этого сделать его varchar. - person Michael Berkowski; 28.06.2012
comment
Спасибо, но я безуспешно пытался изменить его на LIKE. - person Oliver Spryn; 28.06.2012

Если failedlogins является числовым, необходимо явно указать условие

ON failedlogins > 0
person zerkms    schedule 28.06.2012
comment
Ах! Если можно, у меня есть еще два вопроса. В этом случае failedlogins является числовым, и ваше предложение сработало. Что, если он не числовой, могу я сделать что-нибудь вроде ON failedlogins != ''. Я обновлю свой вопрос через секунду с другой полученной ошибкой. - person Oliver Spryn; 28.06.2012
comment
amsprich, ответил на мой первый вопрос. ;) - person Oliver Spryn; 28.06.2012
comment
@ spryno724: IS NOT NULL не равно != ''. Так что это зависит от того, что у вас есть и чего вы хотите достичь. - person zerkms; 28.06.2012

FROM failedlogins RIGHT JOIN siteprofiles ON failedlogins

Я считаю, что ON должно быть условным, например:

failedlogins is not null
person amsprich    schedule 28.06.2012
comment
Хорошо, это было то, что я не привык добавлять. ;) - person Oliver Spryn; 28.06.2012
comment
Извините, что снова вас подслушал, но есть идеи, что может вызвать вторую проблему? - person Oliver Spryn; 28.06.2012
comment
С помощью GROUP BY вам нужно указать каждый выбранный столбец. В качестве альтернативы ORDER BY может быть тем, что вы ищете. stackoverflow.com/questions/2777235/ - person amsprich; 28.06.2012