【问题标题】:Parent Select SQL Query generating Child Select父选择 SQL 查询生成子选择
【发布时间】:2014-06-08 00:12:38
【问题描述】:

这些是我的桌子:

Table_Bill_Summary

| Date | PersonId | BillNo |

Table_Bill_Items

| BillNo | ItemId | Quantity |

Item_MasterTable

| ItemId | ItemName | ItemRate |

我将指定一个 PersonId。这就是我要打印的内容:

SELECT *
FROM Table_Bill_Summary
WHERE PersonId=@X
    (SELECT IM.ItemName,BI.Quantity,IM.ItemRate
     FROM Table_Bill_Items AS BI
     INNER JOIN Item_MasterTable AS IM ON BI.ItemId=IM.ItemId
     WHERE BI.BillNo=??)

我的结果应该是这样的:

23/04/2013      Person123       Bill32
    Item20  23  100
    Item21  20  200
    Item23  1   300
23/04/2013      Person123       Bill39
    Item2   2   100
    Item11  40  800
    Item43  1   700

我希望为父 Select 查询在列 BillNo 上检索到的每一行运行一个子 Select 查询

【问题讨论】:

  • 您的应用程序使用什么语言开发?
  • @eggyal 我正在使用 C# 和 ASP.NET,我正在使用 iTextSharp 在 PDF 上打印。
  • @divinediu 我认为我们可以使用 Rdlc 而不是 itextsharp,这对于这种情况来说非常简单。我们可以直接在 table 上提供数据源。
  • @RajaRajendraprasath 我正在使用 iTextSharp 在我的所有其他软件中进行打印。我需要坚持下去..

标签: mysql sql sql-server select


【解决方案1】:
    select FLD1,FLD2,FLD3 from
(
SELECT CAST(Date as varchar(10)) as FLD1  ,CAST(PersonId as varchar(10)) as FLD2,
cast(BillNo as varchar(10)) as FLD3,1 as FLD4, Billno as fld5
FROM Table_Bill_Summary WHERE  PersonId =@X

union

SELECT CAST(IM.ItemName as varchar(10)) as FLD1  ,CAST(BI.Quantity as varchar(10)) as FLD2,CAST(IM.ItemRate as varchar(10)) as FLD3 ,2 as FLD4, BS.Billno as fld5
FROM Table_Bill_Summary BS inner join Table_Bill_Items AS BI  on bs.BillNo=BI.BillNo
INNER JOIN Item_MasterTable AS IM  ON BI.ItemId=IM.ItemId
WHERE  Bs.PersonId =@X
) as x order by fld5,fld4

【讨论】:

  • 好答案。不过,您可以稍微详细说明您的技术;-) 您应该在这里使用 UNION ALL,因为不会有重复项,而这正是 UNION 想要消除的。
  • @Auto Raja Prakash 是的,我认为这会起作用。我已经通过在本地创建进行了检查。我对您的帖子进行了小修正。
【解决方案2】:

您不能在 SQL 中执行此操作。相反,通过获取按账单排序的连接结果(账单和项目)并在遍历结果集时跟踪最后看到的账单,在您的应用程序中执行操作:

string stm = @"
  SELECT   BillNo, Date, ItemName, Quantity, ItemRate
  FROM     Table_Bill_Summary
      JOIN Table_Bill_Items USING (BillNo)
      JOIN Item_MasterTable USING (ItemId)
  WHERE    PersonId = @Person
  ORDER BY BillNo
";

MySqlCommand cmd = new MySqlCommand(stm, conn);
cmd.Prepare();
cmd.Parameters.AddWithValue("@Person", person_id);
MySQLDataReader rdr = cmd.ExecuteReader();

bool isMore = rdr.Read();
while (isMore) {
  int current_bill = rdr.GetInt32(0);
  // output bill
  do {
    // output item
  } while (isMore = rdr.Read() && rdr.GetInt32(0) == current_bill);
}

【讨论】:

    【解决方案3】:

    你不能。 (至少不是没有一些奇怪的技巧 ;-) SQL 选择语句将始终导致显示 same 列的行列表。

    您通常会使用报告软件或其他编程语言和 GUI 来解决此问题。

    【讨论】:

    • 我正在使用 asp.net 和 c#。您能否指导我或将我链接到我的问题的解决方案?
    • 不,不直接。但是,一种方法是运行主选择语句并用结果填充数组。然后记录记录,你把数据放在一个网格控件(或树视图控件)中,然后执行你的依赖 SQL 并用 ist 结果填充子数据。另一种方法是编写一个 SQL 语句来保存所有连接的主要和详细值。然后循环遍历结果列表,并在检测到的每个组更改时在控件中编写标题行。
    • 啊,你刚刚从 Anto Raja Prakash 那里得到了一个答案,展示了这个奇怪的技巧;-) 你均衡了列类型以便能够合并它们。对于大型 select 语句,这可能会变得相当笨拙,但只能通过 SQL 来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多