'形状 - 追加n#39;现在查询等价

时间:2014-09-21 08:35:15

标签: c# sql asp.net sql-server vb.net

在过去的几周里,我一直在用VB编写的程序转换为C#。 在某些地方,我注意到以奇怪的方式写的查询,单词'形状'和'追加'出现了。 例如:

SHAPE {SELECT Test, IdQuestion, QuestionName, QuestionTimeLimit, ImageLocation 
FROM dbo.userViewConTestQues 
WHERE (Test = 5) ORDER BY QuestionOrder} AS ParentCMD APPEND ({SELECT Answer, 
IdAnswer, Question FROM dbo.userAnswers } AS ChildCMD RELATE IdQuestion TO Question) AS ChildCMD

我完全相信该查询的等价性将是一个内部联接,类似于:

SELECT A.Test, A.IdQuestion, A.QuestionName, A.QuestionTimeLimit, A.ImageLocation,
B.Answer, B.IdAnswer FROM dbo.userViewConTestQues A INNER JOIN 
dbo.userAnswers B ON A.IdQuestion=B.Question WHERE A.Test=5 ORDER BY A.QuestionOrder

调试后我得到以下结果: 旧程序的记录数是60,这意味着60行,而运行我写的新查询得到了400多行,所以我想我错了。 什么是'形状 - 追加'现在是等价的?

编辑: 60行仅属于父记录集,但是孩子的记录集计数为6,但我不知道如何获取它们。

1 个答案:

答案 0 :(得分:0)

如果我没记错,SHAPE APPEND会关联父子数据,结果就是你实际上得到了每个父行的子记录集。在使用结果时,您必须检查该记录集并适当地处理它(如果网格不支持它)。

当你说60行时,你是否可能只计算父记录集?

它也会从父记录集中给你一条记录,即使子记录集中没有行,所以它更像LEFT OUTER JOIN但是没有真正的直接SQL等价物会给你SHAPE APPEND的分层结果。

如果要继续使用SHAPE APPEND,OleDbConnection和OleDbDataAdapter仍支持该语法,但您必须将Provider=MSDataShape添加到连接字符串中。然后在获取行时,您将在父GetChildRows()上使用DataRow来获取子行。