从2个表中SELECT到dataGridView时出现GROUP BY问题

时间:2013-07-19 10:35:12

标签: c# sql sql-server datagridview sqlcommand

在你的帮助下,我做了两个QUERY。我发布了图片,因此您可以看到green squares中的空值是我想看到的,red squares中的值是我不想显示的值。变量vyberradek在数据库中为“子项”INT插入值,但我将其传递给string

所以我会简化:现在我可以显示全部或一点,你会帮我如何显示正确的记录吗?

第一个query执行此操作:

enter image description here

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);

以下是第二个queryenter image description here

 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显示来自其他客户端的已选中复选框,但也显示此客户端的未选中复选框。它只显示数据库中的所有内容,因此它显示了具有其他客户端的已检查内容的行(但只有那些对于此和其他客户端相同的那些行,它是DOESNT CREATE重复项)。第二个节目只检查了这个客户端,但没有他没有选择的那个。因此,当我编辑这个客户端时,我想显示他检查了什么,其余7(7种可能性,他没有检查,所以我可以检查它们)。现在我只能显示我检查的内容(没有未选中)或包括其他客户端检查在内的所有内容(对于此客户端都是相同的)。我希望这是可以理解的,抱歉我的英语不好。

P.S。检查我的意思是检查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.因为SELECT值从未被任何客户b4选中。你可以看到帽子“Nic”被显示,因为它不在表klisluz中。

enter image description here

1 个答案:

答案 0 :(得分:2)

如果我理解你所追求的是什么,这就是阻止你在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工作,使用在线转换器。