有效地查询关系

时间:2017-03-04 22:52:27

标签: sql sql-server

让我们假设表和数据

CREATE TABLE #tA ( id int, fieldA varchar(16))
CREATE TABLE #tB ( idA int, id int, fieldB varchar(16))
CREATE TABLE #tC ( idB int, id int, fieldC varchar(16))

INSERT into #tA VALUES (1, 'A1'), (2, 'A2')
INSERT into #tB VALUES (1, 1, 'A1-B1'), (1, 2, 'A1-B2'), (2, 3, 'A2-B1')
INSERT into #tC VALUES (1, 1, 'A1-B1-C1'), (2, 2, 'A1-B2-C1'), (2, 3, 'A1-B2-C2'), (3, 4, 'A2-B1-C1')

我可以使用

查询与所有数据的完整关系
SELECT A.fieldA, B.fieldB, C.fieldC
FROM #tA as A
JOIN #tB as B ON b.idA=A.id
JOIN #tC as C ON c.idB=b.id

,结果是

fieldA  fieldB  fieldC
A1      A1-B1   A1-B1-C1
A1      A1-B2   A1-B2-C1
A1      A1-B2   A1-B2-C2
A2      A2-B1   A2-B1-C1

在客户端,我希望/需要构建像

这样的对象模型
{
   name: "A1",
   Bs: [
     {
        name: 'A1-B1',
        Cs: [{name: 'A1-B1-C1'}]
     },
     {
        name: 'A1-B2',
        Cs: [{name: 'A1-B2-C1'}, {name: 'A1-B2-C2'}]
...

当然实际的表有更多的字段和行,因此我希望减少网络上多次发送所有字段的开销。
如果从SQL服务器返回数据(如

)就足够了(实际上更容易构建对象模型)
fieldA  fieldB  fieldC
A1      A1-B1   A1-B1-C1
null    A1-B2   A1-B2-C1
null    null    A1-B2-C2
A2      A2-B1   A2-B1-C1

仅当“父”已更改时,将该“父”表的值写入结果集,否则将这些字段设置为空。

使用SQL Server(2014/2016)可以(有效)吗?也许有一些内置功能?
或者甚至内置于网络协议sql-server< - > .net-driver?

1 个答案:

答案 0 :(得分:0)

可以对您的查询执行此操作,但由于最终目标是生成分层对象模型,因此研究对象/关系映射器可以更好地花费时间和精力来自动化大部分繁重的工作。可用的内容取决于客户端应用程序的编程语言; Wikipedia列有几个。