2017-01-11 13 views
0

からすべての結果のオプションを取得します。私は次の表を持っているテーブル

意味、出力は次のようにSHOLD:

aaa | 1 | bbb | x | ccc | on 
aaa | 1 | bbb | x | ccc | off 
aaa | 1 | bbb | y | ccc | on 
aaa | 1 | bbb | y | ccc | off 
aaa | 1 | bbb | z | ccc | on 
aaa | 1 | bbb | z | ccc | off 
aaa | 2 | bbb | x | ccc | on 
aaa | 2 | bbb | x | ccc | off 
aaa | 2 | bbb | y | ccc | on 
aaa | 2 | bbb | y | ccc | off 
aaa | 2 | bbb | z | ccc | on 
aaa | 2 | bbb | z | ccc | off 
aaa | 3 | bbb | x | ccc | on 
aaa | 3 | bbb | x | ccc | off 
aaa | 3 | bbb | y | ccc | on 
aaa | 3 | bbb | y | ccc | off 
aaa | 3 | bbb | z | ccc | on 
aaa | 3 | bbb | z | ccc | off 

しかし、私は...毎回変更することができ、

をキーと値を知らない誰も私は良いアルゴリズムを考えるのを助けることができますそれをするために?

+1

使用しているデータベースであなたの質問にタグを付けてください。 –

+0

SQL Server。 しかし、答えがC#のjavascriptのSQLサーバーまたはOracleまたは任意の言語になる場合は、 –

答えて

1

再帰アルゴリズムを使用する:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication34 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("key", typeof(string)); 
      dt.Columns.Add("val", typeof(string)); 

      dt.Rows.Add(new object[] {"aaa","1"}); 
      dt.Rows.Add(new object[] {"aaa","2"}); 
      dt.Rows.Add(new object[] {"aaa","3"}); 
      dt.Rows.Add(new object[] {"bbb","x"}); 
      dt.Rows.Add(new object[] {"bbb","y"}); 
      dt.Rows.Add(new object[] {"bbb","z"}); 
      dt.Rows.Add(new object[] {"ccc","on"}); 
      dt.Rows.Add(new object[] {"ccc","off"}); 

      Data.data = dt.AsEnumerable() 
       .GroupBy(x => x.Field<string>("key")) 
       .Select(x => new Data() 
       { 
        key = x.Key, 
        values = x.Select(y => y.Field<string>("val")).ToList() 
       }).ToList(); 

      Data.Print(0, new List<string>()); 
      Console.ReadLine(); 
     } 
    } 
    public class Data 
    { 
     public static List<Data> data = null; 
     public string key { get; set; } 
     public List<string> values { get; set; } 

     public static void Print(int level, List<string> output) 
     { 
      if (level == data.Count) 
      { 
       Console.WriteLine(string.Join(" | ", output)); 
      } 
      else 
      { 
       foreach(string _value in data[level].values) 
       { 
        List<string> newOutput = new List<string>(); 
        newOutput.AddRange(output); 
        newOutput.Add(data[level].key); 
        newOutput.Add(_value); 
        Print(level + 1, newOutput); 
       } 
      } 
     } 
    } 

} 
+0

コードは、 。 – jdweng

2

あなたは(あなたの例のように)キーを知っている場合は、することができますだけcross join明示:

select a.*, b.*, c.* 
from (select t.* from t where key = 'a') a cross join 
    (select t.* from t where key = 'b') b cross join 
    (select t.* from t where key = 'c') c; 

あなたはすべてのキーがわからない場合、あなたは、動的使用してクエリを生成する必要がありますSQL。

+0

私は毎回変更することができますキーと値を知っている...任意の方法に感謝:) –

関連する問題