首页 > 解决方案 > SQL 统计关系数据

问题描述

我想知道如何在dataGridView存储过程的帮助下添加额外的数据

注意:这可能与我的 SQL 查询有关(不确定)。

我有以下代码将我的产品数据返回到dataGridView

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["SampleDatabaseWalkthrough.Properties.Settings.SampleDatabaseConnectionString"].ConnectionString))
{
  if (cn.State == ConnectionState.Closed)
    cn.Open();
  using (DataTable dt = new DataTable())
  {
    using (SqlCommand cmd = new SqlCommand("exec dbo.GetProducts", cn))
    {
      SqlDataAdapter adapter = new SqlDataAdapter(cmd);
      adapter.Fill(dt);
      dataGridViewProducts.DataSource = dt;
      dataGridViewProducts.AutoGenerateColumns = false;
    }
  }
}

这是我与上面代码关联的默认存储过程:

CREATE PROCEDURE [dbo].[GetProducts]
AS
    begin
    SELECT * from Products
    end

以上代码的组合 100% 有效。现在我想将关系表数据添加到我的产品查询中,如下所示:

CREATE PROCEDURE [dbo].[GetProducts]
AS
    begin
    SELECT * from Products p
    Join Serials s ON s.Id = p.Id
    end

上面的这个存储过程应该返回我的产品数据+每个产品序列的计数。(IE):

Name: Product 1
Origin: Local
Serials: 15 <-- this is count of relationship table

截屏:

一

问题

正如您在我的屏幕截图中看到的,我的两个产品都在列中收到序列号serials 只有我的产品Table有序列号,因此在serials产品表的列中应该说2,对于产品Lamp应该说0

更新

我只是注意到,在我的查询中,我应该得到像这样的连续剧,Join Serials s ON s.ProductId = p.Id而不是像这样得到它们Join Serials s ON s.Id= p.Id

但问题是这次我得到了 2 个表,但没有 Lamp 产品dataGridView(因为 Lamp 没有任何与之关联的序列号)。

有什么建议吗?

更新 2

序列表架构

CREATE TABLE [dbo].[Serials] (
    [Id]        INT           NOT NULL,
    [ProductId] INT           NOT NULL,
    [Serial]    NVARCHAR (50) NOT NULL,
    [Sold] bit NOT NULL DEFAULT 0,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Serials_Products] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Products] ([Id])
);

标签: c#mysqlsqlvisual-studiowinforms

解决方案


尝试这个。与子查询相比,连接的性能总是更好。

SELECT P.*, COUNT(s.serail)serialCount
FROM product P
LEFT OUTER JOIN serail S ON (p.id = s.PID)
GROUP BY P.id, P.Name, P.Quantity -- _and all other columns of product table_

推荐阅读