MS-SQL Server: ruim como tudo o que a Microsoft faz
Leia em 1 minuto
É incrível mas tudo o que a Microsoft faz é um lixo. Não consigo lembrar de nada que me faça dizer "Nossa, eles detonaram com ____ (seu aplicativo aqui)".
Estou fazendo um job que, infelizmente, deve ser feito em SQL Server. Como não conheço muito sobre ele, estou fazendo as coisas direto em SQL, sem usar procedures, view ou outra feature mais complicada/avançada.
Em um certo momento, precisei fazer um LEFT JOIN
com COUNT
. O problema é que o SQL Server é tão burro que preciso definir cada campo que não faz parte da agregação na cláusula GROUP BY
. Mas adivinha... Isso modifica o resultado!
Para ilustrar, veja um exemplo de "tópicos" e "respostas".
CREATE TABLE topics (
id INT(11) AUTO_INCREMENT NOT NULL,
title VARCHAR(255)
);
CREATE TABLE replies (
id INT(11) AUTO_INCREMENT NOT NULL,
topic_id INT(11)
title VARCHAR(255)
);
INSERT INTO topics (title) VALUES ('Topic #1');
INSERT INTO topics (title) VALUES ('Topic #2');
INSERT INTO replies (title, topic_id) VALUES ('Reply topic #2', 2);
Se eu fizesse a seguinte seleção, deveria me retornar o tópico com a quantidade de respostas:
SELECT
topics.title AS title,
COUNT(replies.id) AS replies
FROM
topics
LEFT JOIN replies ON
topics.id = replies.topic_id
GROUP BY
replies.id;
title: Topic #1, replies: 0
title: Topic #2, replies: 1
Isso funciona no MySQL e provavelmente deve funcionar no PostgreSQL. Mas no MS-SQL Server recebo a seguinte mensagem:
Server: Msg 8120, Level 16, State 1, Line 1
Column 'topics.title' is invalid in the select list because it is not
contained in either an aggregate function or the GROUP BY clause.
E tem gente que ainda paga caro por isso!