遍历SQL列以构建用于引用的EAV表
我有两个电子表格,它们被用作电子表格系统中的参考表,我正忙着将它们转换成SQL。我已将电子表格导入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
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;