2016-02-03 45 views
0

我在SQL表中有以下數據。SQL表到矩陣

Entity1 | Entity2 
A , B 
A , C 
B , D 

我需要將其轉換爲

A, B, C, D 
0, 1, 1, 0 
0, 0, 0, 1 
0, 0, 0, 0 
0, 0, 0, 0 

的第一行是所有實體的名單。 第二行和後續行列出了元素的依賴關係。

由於A依賴於B和C的第二行是

0, 1, 1, 0 

由於B依賴於d只,第三行是

0, 0, 0, 1 

我正在與H2和Java工作。如果有人能夠使用SQL和Java提出建議,它將會有所幫助。

+0

每一行代表由ASC另一個實體訂單? (a是第一行b是第二個c是第三個??)以及它的範圍是什麼? a,b,c,d或所有字母代碼 – sagi

+0

- 每行代表一個實體。 - 第一行,即矩陣的標題,水平方向與下面的行的順序垂直相同 - A,B等代表節點,它們將具有專有名稱。 - 假設節點數量約爲500個左右。 –

回答

0

你的情況這模擬給你想要的結果在Java中

DECLARE @table TABLE (Entity1 VARCHAR(1),entity2 VARCHAR(1)) 
    INSERT INTO @table VALUES ('A','B'),('A','C'),('B','D') 
    DECLARE @i INT=0 
    DECLARE @j INT=0 
    DECLARE @val VARCHAR(150)=',' 
    DECLARE @sel VARCHAR(5000)='' 
    DECLARE @cnt INT 
    SET @cnt=(SELECT COUNT(*) FROM (SELECT entity1 Entity FROM @table UNION SELECT entity2 FROM @table) AS ct) 
    WHILE @i<@cnt 
    BEGIN 
     set @val = @val +',''' + (SELECT TOP(1) LEAD(entity,@i,0) over (ORDER BY entity) FROM (SELECT entity1 Entity FROM @table UNION SELECT entity2 FROM @table) AS nt)+'''' 
     SET @[email protected]+1 
     PRINT replace(@val,',,','') 
    END 
    SET @sel='SELECT ' + replace(@val,',,','') 

    SET @i=0 
    SET @val=',' 
    WHILE @i<@cnt 
    BEGIN 
     DECLARE @firstEntity VARCHAR(1)=(SELECT TOP(1) LEAD(entity,@i,0) over (ORDER BY entity) FROM (SELECT entity1 Entity FROM @table UNION SELECT entity2 FROM @table) AS nt) 
     PRINT @firstEntity 
     WHILE @j<@cnt 
     BEGIN 
      DECLARE @lastEntity VARCHAR(1)=(SELECT TOP(1) LEAD(entity,@j,0) over (ORDER BY entity) FROM (SELECT entity1 Entity FROM @table UNION SELECT entity2 FROM @table) AS nt) 
      PRINT @lastEntity 
      IF EXISTS (SELECT * FROM @table WHERE [email protected] AND [email protected]) 
      BEGIN 
       SET @[email protected]+',''1''' 
      END 
      ELSE 
       BEGIN 
        SET @[email protected]+',''0''' 
       END 

       SET @[email protected]+1 
     END 
     SET @sel= @sel+' UNION ALL SELECT ' + replace(@val,',,','') 
     SET @val=',' 
     SET @j=0 
     SET @[email protected]+1 
    END 
    PRINT @sel 
    EXEC (@sel) 
0

實現(無逗號和支架)

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    List<ArrayList> table = new ArrayList<ArrayList>(); 
    ArrayList<String> row1 = new ArrayList<String>(); 
    row1.add("A"); 
    row1.add("B"); 
    table.add(row1); 
    ArrayList<String> row2 = new ArrayList<String>(); 
    row2.add("C"); 
    row2.add("A"); 
    table.add(row2); 
    ArrayList<String> row3 = new ArrayList<String>(); 
    row3.add("B"); 
    row3.add("D"); 
    table.add(row3); 
    ArrayList<String> row4 = new ArrayList<String>(); 
    row4.add("D"); 
    row4.add("A"); 
    table.add(row4); 
    ArrayList<String> row5 = new ArrayList<String>(); 
    row5.add("D"); 
    row5.add("E"); 
    table.add(row5); 
    ArrayList<String> entity = new ArrayList<String>(); 
    for(int i = 0 ; i < table.size();i++){ 
     for(int j = 0 ; j < table.get(i).size();j++){ 
      String temp = (String) table.get(i).get(j); 

      //to get list of entities for the first Line 
      if(!entity.contains(temp)){ 
       entity.add(temp);System.out.print(temp);}  
     } 
    } 

    System.out.println(); 
    boolean flag = false; 
    for(int x =0 ; x < entity.size(); x++){ 
     for(int z = 0 ; z < entity.size() ; z++){ 

      for(int i = 0 ; i < table.size();i++){ 


        if(table.get(i).get(0) == entity.get(x) & table.get(i).get(1) == entity.get(z)) 
        {System.out.print("1");flag = true;break;} 


      } //i 
      if(flag == false){System.out.print("0");} 
      flag = false; 
     }//z 
     System.out.println(); 
    }//x 


}