Как выполнить полное внешнее соединение или объединить до 6 (шести) таблиц базы данных SQL Server в C#?

#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 
 

Я не знаю, сработает ли этот запрос, так как вы не указали структуру БД, но это должно исправить синтаксическую ошибку, которую вы получаете.