从SQL获得独特的结果

时间:2016-06-22 07:13:25

标签: c# sql

我有非常简单的数据表

ffmpg

我需要表中的独特结果, 我需要id1和id2之间的一组组合对,其中集合中的所有元素都是唯一的

来自样本表的SELECT的可验证结果是:

   pk | id1 | id2 
   1  |  1  |  2
   2  |  1  |  3
   3  |  10 |  2
   4  |  10 |  3
   5  |  20 |  2
   6  |  20 |  3

1| 1|2
4|10|3  

2| 1|3
3|10|2 

1| 1|2
6|20|3  

2| 1|3
5|20|2 

3|10|2
6|20|3 

但我只需要第一次出现可能的结果。 使用4|10|3 5|20|2 GROUP BY id1不能完成我需要的工作。

3 个答案:

答案 0 :(得分:0)

您可以试试这个:

DataTable newTable = view.ToTable(true, "column1", "column2",...); 会做你的任务。

以下是示例

DataTable table = new DataTable("NewTable");

DataColumn column = new DataColumn("ID1", typeof(System.Int32));
table.Columns.Add(column);

column = new DataColumn("ID2", typeof(System.Int32));
table.Columns.Add(column);

DataRow row = table.NewRow();
row.ItemArray = new object[] { 1, 2};
table.Rows.Add(row);

row = table.NewRow();
row.ItemArray = new object[] { 2, 3};
table.Rows.Add(row);

row = table.NewRow();
row.ItemArray = new object[] { 10, 2};
table.Rows.Add(row);

row = table.NewRow();
row.ItemArray = new object[] { 10, 2 };
table.Rows.Add(row);

row = table.NewRow();
row.ItemArray = new object[] { 20, 2};
table.Rows.Add(row);

row = table.NewRow();
row.ItemArray = new object[] { 20, 3};
table.Rows.Add(row);

// Mark all rows as "accepted". Not required
// for this particular example.
table.AcceptChanges();

DataView view = new DataView(table);
view.Sort = "ID1";

DataTable newTable = view.ToTable(true, "ID1", "ID2");

Console.WriteLine("New table name: " + newTable.TableName);


foreach (DataRow row1 in newTable.Rows)
{
    Console.WriteLine();
    for(int x = 0; x < newTable.Columns.Count; x++)
    {
        Console.Write(row1[x].ToString() + " ");
    }
}

Console.ReadLine();

但是你的问题仍然不明确,所以我不确定它是否符合你的要求。如果它是您的概率的解决方案,请添加评论。

答案 1 :(得分:0)

就在这里。这是一个有趣的问题。这段代码对我有用。我已经有点随机,所以每次都会得到不同的结果。

/*create table SourceData (
pk int,
id1 int,
id2 int
)
insert into SourceData (pk,id1,id2)
    values
    ( 1  ,  1  ,  2),
    ( 2  ,  1  ,  3),
    ( 3  ,  10 ,  2),
    ( 4  ,  10 ,  3),
    ( 5  ,  20 ,  2),
    ( 6  ,  20 ,  3)
    */

Create table #temp1 (pk int not null);
--Pick a first row at random
insert into #temp1 (pk)
    select top 1 pk from SourceData
    order by NEWID()
;
declare @KeepGoing int = 1;
-- for as long as we keep finding new rows in SourceData
WHILE( @KeepGoing > 0 )
BEGIN

    insert into  #temp1 (pk)
        -- find 1 row in SourceData where no value matches an existing picked row
        select top 1 pk from SourceData
        where id1 not in (select id1 from #temp1 T inner join SourceData SD on T.pk = SD.pk)
        and id2 not in (select id2 from #temp1 T inner join SourceData SD on T.pk = SD.pk)
        order by NEWID()

    SET @KeepGoing = @@ROWCOUNT
END
-- display results
select SD.* from #temp1 T inner join SourceData SD on T.pk = SD.pk
drop table #temp1

答案 2 :(得分:0)

此查询应该可以解决问题

select min(pk), id1, id2 from table_name group by id1, id2;