【问题标题】:GROUP BY issue when SELECT to dataGridView from 2 tables从 2 个表中 SELECT 到 dataGridView 时的 GROUP BY 问题
【发布时间】:2013-07-18 14:49:26
【问题描述】:

在你的帮助下,我制作了这两个QUERY。我发布了图片,因此您可以看到 green squares 中是我希望看到的空值,而 red squares 中是我不想显示的值。变量vyberradek 为“子键”插入值,它在数据库中是INT,但我通过string 传递它。

所以我将简化:现在我可以显示全部或部分,您能帮我如何显示正确的记录吗?

第一个query 这样做:

string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}'  GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

这是第二个query 的作用:

 string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}' and klisluz.subkey ='" + vyberradek + "' GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

如您所见,我还想显示空的。我认为您可能还需要检查复选框的代码:

 for (int i = 0; i < dtg_ksluzby.Rows.Count; i++)
            {
                var row = dtg_ksluzby.Rows[i];
                int id = (int)row.Cells["ID"].Value;

                using (var novyprikaz3 = new SqlCommand("SELECT * from klisluz WHERE subkey='" + vyberradek + "'AND IDzajsluz=" + id, spojeni))
                {

                    spojeni.Open();
                    SqlDataReader precti3 = novyprikaz3.ExecuteReader();
                    if (precti3.HasRows)
                    {
                        row.Cells[5].Value = true;
                    }
                    spojeni.Close();
                }
            }

请你们建议我query 应该如何选择未选中的值(在 klisluz 表中没有)和选中的值?

我看到没有人回复得这么好,让我举一个简单的例子:当我创建客户端时,我从 10 个复选框中选中了 3 个。所以它选择了 3 行(以及它添加到表 klisluz 中的那些)。我有这两个queriesFirst query 显示来自其他客户端的选中复选框,但也显示了该客户端的未选中复选框。它只是显示数据库中的所有内容,因此它显示带有其他客户端检查的内容的行(但只有那些与此客户端和其他一些客户端相同的行,它不会创建重复项)。第二个节目只检查了这个客户,但没有他没有选择的那些。所以当我编辑这个客户时,我想显示他检查了什么以及剩下的 7 个(他没有检查的 7 种可能性,所以我可以检查它们)。现在我可以只显示我检查的内容(没有未检查的)或包括其他客户端检查的所有内容(对于这个客户端来说是相同的)。我希望这是可以理解的,对不起我的英语不好。

附:用检查我的意思是检查checkbox(选择行) 基本上它是一个为客户添加服务的程序。

非常感谢您的关注,如果您阅读了所有内容,也感谢您的阅读。我在这个问题上坚持了 2 天:/

kwwallpe 的图片: 您可以在此处看到任何客户从未选择过“Nic”,因此它会显示出来。

为了让我的问题更清楚 - 我从另一个表中获取其中的一些列(如您在 sql 查询中所见)。

这是kwwallpe的代码:

 string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}' and ISNULL(klisluz.subkey, '" + vyberradek + "') = '" + vyberradek + "' GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);

这段代码非常接近我认为那 2。因为它选择了任何客户 b4 从未选择过的值。您可以看到帽子“Nic”被显示,因为它不在 klisluz 表中。

【问题讨论】:

    标签: c# sql sql-server datagridview sqlcommand


    【解决方案1】:

    如果我了解您的需求,这就是阻止您获取 klisluz 中没有条目的行的部分:

    WHERE zajsluz.akce= '{0}' and klisluz.subkey ='" + vyberradek + "'
    

    对于 klisluz 中不存在的行,子键将为 NULL,它不会与 WHERE 子句匹配任何内容。要同时获取这些行,您可以将当前的 WHERE 子句替换为:

    WHERE zajsluz.akce= '{0}' and ISNULL(klisluz.subkey, '" + vyberradek + "') ='" + vyberradek + "'
    

    这是完整的代码行:

    string sQuery = string.Format("SELECT zajsluz.akce,zajsluz.text,klisluz.pocet,klisluz.subkey,zajsluz.ID FROM zajsluz LEFT JOIN klisluz ON zajsluz.ID=klisluz.IDzajsluz WHERE zajsluz.akce= '{0}' and ISNULL(klisluz.subkey, '" + vyberradek + "') = '" + vyberradek + "' GROUP BY klisluz.subkey,zajsluz.akce,zajsluz.text,klisluz.pocet,zajsluz.ID", sZakce);
    

    确定是否应选中复选框:

    if (precti3.HasRows)
    {
        precti3.Read();
        if (precti3.Item("subkey") != Null)
        {
            row.Cells[5].Value = true;
        }
        else
        {
            row.Cells[5].Value = false;
        }
    }
    

    认为这就是它在 C# 中的表现。我在 VB.NET 中工作,为此使用了一个在线转换器。

    【讨论】:

    • 您好,非常感谢您尝试回答我的问题,但它的作用是它基本上选择了所有复选框(这是正确的)+ 那些从未被任何客户 b4 选择过的复选框,所以我发布了一张图片,这样你就可以清楚地看到它的作用。非常感谢你,我希望我们可以让它正常工作。我认为您已接近解决方案。
    • 选中复选框是一个单独的问题。您需要查看 SqlDataReader 中的实际值。如果 klisluz.subkey 存在,听起来你想检查该框,所以我会选择 precti.Read(),然后检查 precti.Item("subkey") == Null 是否未选中复选框(所有这些都在你的 if (precti.HasRows) 块中)。
    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多