Sql server 从SQL server返回非表格形式的数据
请原谅我的标题含糊不清,但我找不到更合适的词来概括我的问题 在数据库中有两个表,我想组合并从中检索数据:Sql server 从SQL server返回非表格形式的数据,sql-server,database,tsql,join,Sql Server,Database,Tsql,Join,请原谅我的标题含糊不清,但我找不到更合适的词来概括我的问题 在数据库中有两个表,我想组合并从中检索数据: Id Name Description Id Batch Quantity 1 Item_A .... 1 1A 25 2 Item_B .... 1 1B 25 3
Id Name Description Id Batch Quantity
1 Item_A .... 1 1A 25
2 Item_B .... 1 1B 25
3 Item_C .... 1 1C 50
. 1 1D 50
. 2 2A 21
. . .
. . .
我想将第二个表中的数据与其在第一个表中对应的Id进行组合,
即为批次项目提供适当的名称和说明
简单的联接确实会提供我想要的数据,但是联接两个表会生成一个大表,其中对于具有相同Id的每个批次,都会重复“描述”列,即使对于相同Id只有一个描述数据就足够了
是否有任何方法可以将名称和描述数据与第二个表中的相应Id值相结合,但不会产生冗余数据,其中名称和相当长的描述列不会对同一Id重复?
我尝试过的一种解决方案是分别检索这两个表,但按照相同的顺序根据Id进行排序。通过这种方式,我可以使用简单的映射函数创建一个伪对象,如下所示:
Main{
List<Item> Items
}
Item{
string Name
string Description
List<Quantity> Quantities
}
Quantity{
string Batch
int Quantity
}
Main{
清单项目
}
项目{
字符串名
字符串描述
列出数量
}
数量{
串批
整数
}
然而,这打破了两种语言中的数据操作步骤,并将使代码变得复杂和难以理解
最好是一次检索所有项目的数据(执行一次存储过程)。有人能证明这是一种很好的方法吗?您可以尝试使用XML 下面是如何在MS SQL Server中生成父/子一对多XML SQL
-- DDL and sample data population, start
DECLARE @parent TABLE (ID INT PRIMARY KEY, ItemName VARCHAR(30));
INSERT INTO @parent (ID, ItemName) VALUES
(1, 'Item_A'),
(2, 'Item_B');
DECLARE @child TABLE (ID INT IDENTITY PRIMARY KEY, ParentID INT, Batch CHAR(2), Quantity INT);
INSERT INTO @child (ParentID, Batch, Quantity) VALUES
(1, '1A', 25),
(1, '1B', 25),
(1, '1C', 50),
(2, '1D', 50),
(2, '2A', 21);
-- DDL and sample data population, end
SELECT p.*
, (
SELECT c.*
FROM @child AS c
WHERE c.ParentID = p.ID
FOR XML PATH('r'), TYPE, ROOT('child')
)
FROM @parent AS p
FOR XML PATH('r'), TYPE, ROOT('root');
输出
<root>
<r>
<ID>1</ID>
<ItemName>Item_A</ItemName>
<child>
<r>
<ID>1</ID>
<ParentID>1</ParentID>
<Batch>1A</Batch>
<Quantity>25</Quantity>
</r>
<r>
<ID>2</ID>
<ParentID>1</ParentID>
<Batch>1B</Batch>
<Quantity>25</Quantity>
</r>
<r>
<ID>3</ID>
<ParentID>1</ParentID>
<Batch>1C</Batch>
<Quantity>50</Quantity>
</r>
</child>
</r>
<r>
<ID>2</ID>
<ItemName>Item_B</ItemName>
<child>
<r>
<ID>4</ID>
<ParentID>2</ParentID>
<Batch>1D</Batch>
<Quantity>50</Quantity>
</r>
<r>
<ID>5</ID>
<ParentID>2</ParentID>
<Batch>2A</Batch>
<Quantity>21</Quantity>
</r>
</child>
</r>
</root>
1.
项目A
1.
1.
1A
25
2.
1.
1B
25
3.
1.
1C
50
2.
项目B
4.
2.
1D
50
5.
2.
2A
21
如果我理解正确,您要求的是通常由前端执行的操作,而不是查询本身。拉取冗余数据,或在两个查询中拉取数据,以避免重复数据。还可以添加当前SQL。您可以从联接表中选择所需的列。@DaleK我正在使用SQL server 2014。我想知道这样的事情是否可以在数据库本身中完成,或者如果没有,是否有更好的方法。@j1mbl3s我想要所有的列(因为我希望每个Id至少有一个名称和描述),但我想避免冗余的dataBetter方法是不在数据库中完成。谢谢你的想法。我将尝试将此应用于我的解决方案。