1

以下での作業:

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();
        }

Table2のLocationIDに複数の値がない限り、これはすべて正常に機能します。

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 |
+----+------------+
| 6  |     7      |
| 6  |     7      |
+----+------------+

そしてこれを入手してください:

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からエントリを削除してください

4

1 に答える 1

3

それ以外の

LEFT JOIN Table2

試す:

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

于 2013-03-15T16:18:02.960 に答える