从 2 个表中 SELECT 到 dataGridView 时的 GROUP BY 问题
Posted
技术标签:
【中文标题】从 2 个表中 SELECT 到 dataGridView 时的 GROUP BY 问题【英文标题】:GROUP BY issue when SELECT to dataGridView from 2 tables 【发布时间】: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 中的那些)。我有这两个queries
,First 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 表中。
【问题讨论】:
【参考方案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)
块中)。
以上是关于从 2 个表中 SELECT 到 dataGridView 时的 GROUP BY 问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 中将数据从 1 个视图插入到 2 个表中