2015-02-11 2 views
0

Я пытаюсь отобразить данные из двух отдельных таблиц в виде сетки данных, я знаю, что это может быть не предназначено для этой цели, хотя я уверен, что есть способ чтобы остановить его создание нескольких повторяющихся строк, как показано ниже;C# удалять дублированные строки в виде сетки данных

enter image description here

Вот код для извлечения данных (я намерен включить фильтр или конкретный поисковый запрос позже, как заметил в коде, что является сегодня день);

private void FillPatients() 
{ 
    SqlConnection connection = new SqlConnection(); 

    //DateTime timeNow = DateTime.Now; 
    //string format = "MMM ddd d HH:mm yyyy"; 

    try 
    { 
     connection.ConnectionString = connectionPath; 
     connection.Open(); 

     SqlCommand cmd = new SqlCommand("SELECT BookingId, Date, PatientId, Firstname, Surname FROM Bookings, Patients", connection); 
     //cmd.Parameters.AddWithValue("@Date", timeNow.ToString(format)); 
     SqlDataAdapter dap = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     dap.Fill(dt); 

     BindingSource bs = new BindingSource(); 
     bs.DataSource = dt; 
     dgv.DataSource = bs; 
     dap.Update(dt); 

     DialogResult dlgResult; 
     dlgResult = MessageBox.Show(
       "Patients loaded", 
       "Patients", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Information, 
       MessageBoxDefaultButton.Button1); 

    } 
    catch (SqlException sql) 
    { 
     MessageBox.Show(sql.Message); 
    } 
    finally 
    { 
     connection.Close(); 
     connection.Dispose(); 
    } 
} 
+2

Почему бы не изменить ваш запрос, чтобы выбрать 'DISTINCT' также где находится вторая таблица, которую вы выбираете из ..? если это все хранится в одной таблице, то «Distinct» может вернуть то, что вам нужно, как это 'SqlCommand cmd = новый SqlCommand (« SELECT Distinct BookingId, Date, PatientId, Firstname, Surname FROM Bookings, Patients », connection);' также вы можете сделать sub select или использовать предложение Where .. здесь много параметров – MethodMan

+1

Похоже, что ваш SQL не совсем то, что вы хотите. Возможно, вы ищете 'INNER JOIN' на' Bookings.PatientId' '' Patients.PatientId' (если ваша схема поддерживает это)? – wgraham

+0

Что вы подразумеваете под «дублирующими» строками? Я не вижу дубликатов в ваших скриншотах, если сравнивать все значения. –

ответ

0

(преобразованного из комментария)

Что ваш запрос в настоящее время производит является cross join. По сути, это означает, что вы получите каждую строку от Bookings в сочетании с каждой строкой от Patients.

Что вы, возможно, хотите, это inner join. Внутреннее соединение позволяет указать предикат для записей, соединенных с «правой» таблицей (в данном случае Patients), поэтому для каждого Booking вы можете получить связанный с ним связанный с ним Patient на основе внешнего ключа.

Примечание: вы можете выполнить тот же результат при перекрестном соединении через предложение WHERE, но оно устарело и, в зависимости от СУБД, вы можете видеть разную производительность.

-1

Я догадывался, что вам нужно изменить SQL в:

SELECT BookingId, Date, PatientId, Firstname, Surname 
FROM Bookings 
INNER JOIN Patients ON Patients.PatientId = Bookings.PatientId; 
+0

У Wgraham было понятие, и R.shilling вы дали мне простой ответ, независимо от того, спасибо вам всем за вашу помощь – 10AlexD10