2013-03-15 7 views
1

아닌 하나 개의 인스턴스 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

에서 항목을 제거 할 필요가 경우에도
+0

count> 1 인 항목을 가져 오려면 먼저 CTE를 수행하고 제외하려면 where 절에 추가하십시오. 나는 당신에게 SQL을 줄 것이지만 나는 회의에 가야한다. – Hogan

+0

CTE (Common Table Expression)를 만드는 방법에 익숙하지 않은 사용자는이 MSDN 사이트 [CTE SQL Server] (http://msdn.microsoft.com/en-us/library/ms190766 – MethodMan

+0

@Hogan strSelectSql의 시작 부분에 WITH의 형식을 추가 했으므로 sytax에 대해 확신하지 못했습니다. SqlException이 있습니다. 나는 전에 CTE를 사용 해본 적이 없으며 전에 Count (*) = 1 Function을 가지지 않았다. 특히 C#에서 사용할 때 주제에 대한 많은 훌륭한 문서를 찾을 수 없습니다. – user2140261

답변

3

대신

LEFT JOIN Table2

시도 :

LEFT JOIN (Select id, locationId from table2 group by id, locationId having count(*) = 1) as table2

+0

이것은 실제로 이것이 내 머리 속에있는 것과 거의 동일하고 원래 시도 했으므로 예상대로 작동했습니다. 왜 광산이 작동하지 않았지만 이것이 효과가 있었습니까. 다른 사용자가 시도하려고하는 곳과 비교하면 CTE 경로는 나에게 거의 동일한 것처럼 보입니다. – user2140261

+0

나는 그것이 선호의 문제라고 생각한다. CTE를 사용하면 정확히 동일한 계획으로 최적화해야합니다. 하위 쿼리가 더 복잡해지면 CTE를 더 쉽게 읽을 수 있지만 사소한 경우에는 하위 쿼리를 사용합니다. – paul

관련 문제