아닌 하나 개의 인스턴스 UNIQUE 값을 반환 :만, 다음과 같은 작업 각
string strSelectSql = "SELECT Table1.ID, Table1.Status,
Table1.CustomerName,Table1.Date, Table1.LocationID,
Table2.LocationID As [LocationID 2] FROM Table1 LEFT JOIN
Table2 ON Table1.ID = Table2.ID
WHERE (Date Is Null AND ID= @SearchForString AND
Status != 'Archived') OR
((Date Between @FromDate AND @ToDate)
AND ID= @SearchForString AND Status != 'Archived')";
SqlConnection SqlConn = new SqlConnection(cstrDatabaseConnection);
SqlDataAdapter SqlAdpt = new SqlDataAdapter();
SqlCommand SqlCom = new SqlCommand(strSelectSql,SqlConn);
SqlCom.Parameters.AddWithValue("@SearchForString",strSearchString);
SqlCom.Parameters.AddWithValue("@FromDate",strFromDate);
SqlCom.Parameters.AddWithValue("@ToDate",strToDate);
SqlAdpt.SelectCommand = SqlCom;
try
{
DataSet TempDS = new DataSet();
SqlConn.Open();
SqlAdpt.Fill(TempDS);
SqlConn.Close();
SqlConn.Dispose();
if (Convert.ToInt32(TempDS.Tables[0].Rows.Count) > 0)
{
dgvQueryResult.DataSource = TempDS.Tables[0];
dgvQueryResult.Refresh();
dgvQueryResult.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
TempDS.Dispose();
}
}
catch (SqlException sqlE)
{
MessageBox.Show(sqlE.Message);
SqlConn.Close();
SqlConn.Dispose();
}
catch (Exception UnknownE)
{
MessageBox.Show(string.Format("Unknown Exception: {0}",UnknownE.Message);
SqlConn.Close();
SqlConn.Dispose();
}
finally
{
if (SqlConn != null) SqlConn.Dispose();
}
것은 이제이 모든 벌금과 멋쟁이 작동을 표 2는 LocationID
에 대한 여러 값을 가지고 있지 않는Table2
+----+------------+
| ID | LocationID |
+----+------------+
| 6 | 7 |
| 6 | 7 |
+----+------------+
이 가져 오기 :
Table2
+----+------------+
| ID | LocationID |
+----+------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 6 | 7 |
| 6 | 7 |
| 7 | 8 |
| 7 | 9 |
+----+------------+
은 내가 무시 할
Table2
+----+------------+
| ID | LocationID |
+----+------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 8 |
| 7 | 9 |
+----+------------+
하지만 내가 원하는거야 :
Table2
+----+------------+
| ID | LocationID |
+----+------------+
| 6 | 6 |
+----+------------+
을 LocationID가 중복되지 않기 때문에.
또한, 나는 하시겠습니까 :
Table2
+----+------------+
| ID | LocationID |
+----+------------+
| 7 | 8 |
| 7 | 9 |
+----+------------+
을 다시 LocationID가 중복되지 않기 때문에.
나는 또는이 될 것입니다 경우가 있다면 전에 TempDS에서 이러한 행을 제거 할 의사도 좀 더 효율적인 :
dgvQueryResult.DataSource = TempDS.Tables[0];
경우이거나 가장 효율적인 경우 것은 바로 dgvQueryResult
에서 항목을 제거 할 필요가 경우에도
count> 1 인 항목을 가져 오려면 먼저 CTE를 수행하고 제외하려면 where 절에 추가하십시오. 나는 당신에게 SQL을 줄 것이지만 나는 회의에 가야한다. – Hogan
CTE (Common Table Expression)를 만드는 방법에 익숙하지 않은 사용자는이 MSDN 사이트 [CTE SQL Server] (http://msdn.microsoft.com/en-us/library/ms190766 – MethodMan
@Hogan strSelectSql의 시작 부분에 WITH의 형식을 추가 했으므로 sytax에 대해 확신하지 못했습니다. SqlException이 있습니다. 나는 전에 CTE를 사용 해본 적이 없으며 전에 Count (*) = 1 Function을 가지지 않았다. 특히 C#에서 사용할 때 주제에 대한 많은 훌륭한 문서를 찾을 수 없습니다. – user2140261