#sql #sql-server #tsql
Вопрос:
Я пытаюсь объединить 6 таблиц, как показано в этом коде ниже, и показать все в одном представлении datagrid из базы данных SQL Server.
Но я получаю эту ошибку
Неправильный синтаксис при соединении ключевых слов
Вот что я попробовал — может ли кто-нибудь помочь мне в этом, пожалуйста:
using(SqlConnection connection = new SqlConnection(shoolmanangmentconn))
{
string sql = "SELECT s1.FirstName, s1.LastName, "
"s2.EXAMSMATHEMATICS "
"s3.TOTALMATHEMATICS"
"s4.OVERALLTOTALMATHEMATICS"
"s5.POSITIONMATHEMATICS,"
"s6.GRADEMATHEMATICS "
"FROM(SELECT FirstName, LastName,ROW_NUMBER() OVER(ORDER BY FirstName)As rn1 FROM tbl_TestingTheApplicationsNAME)as s1 "
"FULL OUTER JOIN(SELECT EXAMSMATHEMATICS,ROW_NUMBER() OVER (ORDER BY EXAMSMATHEMATICS)As rn2 FROM tbl_EXAMSSCORES)as s2 "
"FULL OUTER JOIN(SELECT TOTALMATHEMATICS,ROW_NUMBER() OVER (ORDER BY TOTALMATHEMATICS)As rn3 FROM tbl_TOTALSCORES)as s3 "
"FULL OUTER JOIN(SELECT OVERALLTOTALMATHEMATICS,ROW_NUMBER() OVER (ORDER BY OVERALLTOTALMATHEMATICS)As rn4 FROM tbl_OVERALLSCORES)as s4 "
"FULL OUTER JOIN(SELECT POSITIONMATHEMATICS,ROW_NUMBER() OVER (ORDER BY POSITIONMATHEMATICS)As rn5 FROM tbl_POSITIONSCORES)as s5"
"FULL OUTER JOIN(SELECT GRADEMATHEMATICS,ROW_NUMBER() OVER (ORDER BY GRADEMATHEMATICS)As rn6 FROM tbl_GRADESCORE)as s6 ON s1 ON s5 ON s4 ON s3 ON s2 As s6 ON s1.rn1 = s6.rn6=s5.rn5=s4.rn4=s3.rn3=s2.rn2";
SqlCommand sqlCommand = new SqlCommand(sql, connection);
DataTable dataTable = new DataTable();
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
sqlDataAdapter.Fill(dataTable);
dgvRESULTPRINTER.ItemsSource = dataTable.DefaultView;
}
Комментарии:
1. Какое это имеет отношение к C# или WPF?
2. Вам было бы гораздо лучше, если бы запрос работал в SSMS, прежде чем вводить его в свой код. Также C# предоставляет строковый оператор дословного перевода,
@
который, если вы ставите в начало строки, означает, что вам не нужно постоянно останавливаться и начинать.3. @kcisrael kicсо почему вы объединяете sql-запрос? строковый sql, вы можете дать полный запрос и объединить, только если вы передаете параметры в запрос. Если вы можете добавить структуры таблиц, может помочь в написании запроса.
4. Я не вижу, как этот запрос (даже с исправленным рабочим синтаксисом) дает значимый набор результатов. Присоединение только к номеру строки не имеет логического смысла. Несчастливый человек с самым низким именем ассоциируется с самыми низкими оценками?
5. @Gudwlk При передаче параметров нет необходимости объединять, например
select Bar from Foo where ShoeSize > @ClownFeet;
. Объединение необходимо в первую очередь для замены или добавления имен объектов, напримерselect @ColumnList from @Table;
, не работает, или для поддержки SQL-инъекции, например'select ' LittleBobbyTables '; -- Nothing can go worng.'
.
Ответ №1:
В этом заявлении SQL есть 2 основные проблемы.
- Вам нужно
ON
после каждогоFULL OUTER JOIN
описания, как связаны наборы данных с обеих сторонFULL OUTER JOIN
, а не с сериейON
в конце.
FROM
(SELECT FirstName, LastName, ROW_NUMBER() OVER (ORDER BY FirstName) As rn1
FROM tbl_TestingTheApplicationsNAME) AS s1
FULL OUTER JOIN
(SELECT EXAMSMATHEMATICS, ROW_NUMBER() OVER (ORDER BY EXAMSMATHEMATICS) As rn2
FROM tbl_EXAMSSCORES)as s2
ON s1.rn1 = s2.rn2
- Вам нужны дополнительные запятые в
SELECT
операторе между каждым из столбцов.
SELECT s1.FirstName, s1.LastName, s2.EXAMSMATHEMATICS, s3.TOTALMATHEMATICS,
s4.OVERALLTOTALMATHEMATICS, s5.POSITIONMATHEMATICS, s6.GRADEMATHEMATICS
Я не знаю, сработает ли этот запрос, так как вы не указали структуру БД, но это должно исправить синтаксическую ошибку, которую вы получаете.