为了上下文,我正在从已导入数据库的多个Excel工作表中进行一次数据转换。数据未规范化,我正在尝试将其标准化。
我在SQL数据库中有3个表。它们被称为OldAssets,OldTransactions和OldUsers。
OldTransactions有7903条记录。 OldUsers有7437. OldAssets有9764
我使用LINQ to SQL使用此代码查询这些表
from oa in OldAssets
from ot in OldTransactions
from u in OldUsers
where (oa.Asset_Serial_Number == ot.Asset_Serial_Number && ot.User_EID == u.User_EID && ot.Asset_Tag == oa.Asset_Tag)
select new Transactions {
DevCenter = ot.Transaction_Dev_Center,
Action = ot.Transaction_Action,
Status = ot.Transaction_Status,
ModificationDate = ot.Modified,
ModifiedBy = ot.ModifiedBy,
CreatedBy = ot.CreatedBy,
TransactionDate = (System.DateTime)ot.Transaction_Date,
Transaction_Asset = (System.Int32)oa.ID,
Transaction_User = (System.Int32)u.ID }
我正在尝试遍历所有OldTransactions,并且对于每个OldTransaction,创建一个新事务,根据资产序列号和user_EID的映射来指定Transaction_Asset和Transaction_User。
我的结果是给了我超过10,000条新“交易”的记录。我不明白我怎么能获得比我拥有的OldTransactions数量更多的记录。
我可以编写哪些查询将为每个OldTransaction返回一个新的Transaction,但是根据serial_number和User_EID的映射添加了Transaction_Asset和Transaction_User的属性?
答案 0 :(得分:8)
为什么不应该呢?你从三个表的笛卡尔积中选择,意味着总行数是7903 x 7437 x 9764,这是几十亿:来自OldAssets的一行的所有可能组合,来自OldTransactions的一行和来自OldUsers的一行。
然后,按照where
条件过滤了这几十亿,如你所说,你只剩下10,000多。
答案 1 :(得分:4)
从您的问题看来,您似乎只想复制包含其他数据的所有交易。我觉得这样的事情可行:
from ot in OldTransactions
select new Transactions {
DevCenter = ot.Transaction_Dev_Center,
Action = ot.Transaction_Action,
Status = ot.Transaction_Status,
ModificationDate = ot.Modified,
ModifiedBy = ot.ModifiedBy,
CreatedBy = ot.CreatedBy,
TransactionDate = (System.DateTime)ot.Transaction_Date,
Transaction_Asset = (System.Int32)(
from oa in OldAssets
where oa.Asset_Serial_Number == ot.Asset_Serial_Number &&
ot.Asset_Tag == oa.Asset_Tag
select oa.ID).FirstOrDefault(),
Transaction_User = (System.Int32)(
from u in OldUsers
where ot.User_EID == u.User_EID
select u.ID).
FirstOrDefault()) }