遍历SQL列以构建用于引用的EAV表

遍历SQL列以构建用于引用的EAV表,sql,traversal,Sql,Traversal,我有两个电子表格,它们被用作电子表格系统中的参考表,我正忙着将它们转换成SQL。我已将电子表格导入SQL,并希望从导入的表中构建一种EAV实体属性值表。我知道这不是最有效的方法,但现在已经足够好了 WHERE_COLUMN COL1 COL2 COL3 COL4 ROW1 2.00 0.00 4.00 10.00 ROW2 2.00 5.00 2.00 2.00 ROW3

我有两个电子表格,它们被用作电子表格系统中的参考表,我正忙着将它们转换成SQL。我已将电子表格导入SQL,并希望从导入的表中构建一种EAV实体属性值表。我知道这不是最有效的方法,但现在已经足够好了

WHERE_COLUMN    COL1    COL2     COL3    COL4
ROW1            2.00    0.00     4.00   10.00
ROW2            2.00    5.00     2.00    2.00
ROW3            2.00    2.00     0.00    2.00
ROW4            2.00    0.00     0.00    0.00
ROW5            2.00    2.00    10.00   80.00
ROW6            2.00    0.00     5.00    0.00
必须成为:

ROW1    COL1    2.00
ROW1    COL2    0.00
ROW1    COL3    4.00
ROW1    COL4   10.00

....

ROW6    COL3    5.00
ROW6    COL4    0.00

....

ROW(n)  COL(n)  0.00

由于这些表相当大,并且有多个可变数量的列(有些多达50列),因此手工操作将非常繁琐。每个表的行数和列数可能会随着时间的推移而变化,因此更容易插入/更新。任何想法都是受欢迎的,或者一种更好、更干净的方法也是受欢迎的。谢谢

如果我坚持您的列-行模型,我会使用如下表格布局:

**table sheetvalues**  
id: integer auto_increment primary key
sheet_id: integer foreign key to table sheet
rownr: integer not null indexed
colnr: integer not null indexed
value: integer (or whatever)

**table sheet**  
id: integer auto_increment primary key
sheetname: varchar
rowcount: integer
colcount: integer
您可以通过使用C、php、perl、Java等语言构建动态SQL语句来导入表。 我将使用Delphi伪代码

function GetConversionSQL(DBName, Sheetname, SheetDef, DataTable: string): string;
var
  DefQuery: TQuery;
  Rowcount: integer;
  ColCount: integer;
  i: integer;
  Select: string;
begin
  DefQuery:= TQuery.Create(Form1);
  try
    DefQuery.DatabaseName:= DBName;
    DefQuery.SQL.Text:= 'SELECT rowcount, colcount FROM '+SheetDef+
                        'WHERE sheetname = ' + sheetname; 
    DefQuery.Open;
    //DefQuery will open on the first and only row
    RowCount:= DefQuery.FieldByName('Rowcount').AsInteger;
    ColCount:= DefQuery.FieldByName('Colcount').AsInteger;
  finally
    DefQuery.Free;
  end;

  Select:= '';
  if colcount > 0 then begin
    for i:= 1 to colcount do begin
      Select:= Select + 'SELECT where_col, col'+IntToStr(i)+' FROM '+DataTable;
      if i < colcount then Select:= Select + ' UNION ';
    end;
    Select:= 'INSERT INTO sheetvalues '+ Select;
  end;
  Result:= Select;
end;

procedure ConvertATable;
var
  ConversionSQL: string;
  ImportQuery: TQuery;
begin
  ConversionSQL:= GetConversionSQL('Mydatabase', 'sheet1', 'sheetdef'
                                   , 'table_sheet1');
  ImportQuery:= TQuery.Create(Form1);
  try
    ImportQuery.DatabaseName:= 'MyDatabase';
    ImportQuery.SQL.Text:= ConversionSQL;
    ImportQuery.ExecSQL;
  finally
    ImportQuery.Free; 
  end;
end;