Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从SQL server返回非表格形式的数据_Sql Server_Database_Tsql_Join - Fatal编程技术网

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方法是不在数据库中完成。谢谢你的想法。我将尝试将此应用于我的解决方案。