1

我正在使用 ASP.NET C# 来输出 SQL Server 数据库查询的结果,并试图让结果在每个法院仅显示一条记录,但同时也显示每个法院的多个联系方式。

相关表格为(PK 为粗体,FK 为斜体):

法院(Court_ID、Court_Name、备注、城镇、邮政编码)

联系人(Contact_ID、Contacts_Name、Contacts_no、*Court_ID*、*Court_Contact_Type_ID*)

Contact_Type ( Court_Contact_Type_ID , Court_Contact_Type_Desc)

目前,我的问题是,每个法院的联系人数量与每个法院的联系次数一样多,但我会多次重复每个法院的详细信息。我知道它为什么这样做,但我不知道如何让它按照我想要的方式工作。

我不确定解决方案是在 SQL 查询本身(可能通过嵌套...?)还是在 C# 代码中,因为我使用的是“HasRows”。我在下面包含了两个代码片段。

string myQuery = "SELECT Court_Name, Town, Postcode, Note, Contacts_Name, Contacts_no, Court_Contact_Type_Desc " +
                 "FROM Court C, Contacts CON, Contact_type CONT " +
                 "WHERE C.Court_ID = CON.Court_ID AND CON.Court_Contact_Type_ID = CONT.Court_Contact_Type_ID AND C.Court_ID = '3' ";


SqlConnection connection = new SqlConnection(connStr);
SqlCommand myCommand = new SqlCommand(myQuery, connection);
SqlDataReader myDataReader;
connection.Open();

myDataReader = myCommand.ExecuteReader();

if (myDataReader.HasRows)
{

    while (myDataReader.Read())
    {

        string court_name = myDataReader["Court_Name"].ToString();
        string court_town = myDataReader["Town"].ToString();
        string court_pcode = myDataReader["Postcode"].ToString();
        string court_note = myDataReader["Note"].ToString();
        string court_contact_name = myDataReader["Contacts_Name"].ToString();
        string court_contact_desc = myDataReader["Court_Contact_Type_Desc"].ToString();
        string court_contacts_no = myDataReader["Contacts_no"].ToString();

        Response.Write("<strong>" + court_name + "</strong><br>" + court_town + "<br>" + court_pcode + "<p>" + court_note + "</p>" + "<p>" + court_contact_name + " - " + court_contact_desc + " : " + court_contacts_no + "</p>");

    }

}

最终输出应如下所示:

阿伯加文尼地方法院
阿伯加文尼
NP7 5DL

该法庭仅对听证开放。额外的法庭笔记......

联系人
联系人姓名 1 - 代理法院经理:01633 64xxxx
联系人姓名 2 - 代理办公室经理:01633 64xxxx
联系人姓名 3 - 代理名单官员:01633 64xxxx
联系人姓名 4 - 法官书记员:01633 64xxxx

一如既往地感激地收到任何帮助!

干杯

4

3 回答 3

2

您可以这样解决问题:

  • 将 court_id 添加到选择列表
  • 添加排序标准,将属于同一法院的行彼此相邻
  • 在遍历返回的数据时,看看你之前是否看过 Court id
  • 如果这是您第一次看到法院 ID,请同时显示法院和联系方式
  • 如果您以前看过此法院 ID,请仅显示联系信息

这是一个如何做到这一点的例子:

string myQuery = "SELECT C.Court_ID, Court_Name, Town, Postcode, Note, Contacts_Name, Contacts_no, Court_Contact_Type_Desc " +
             "FROM Court C "+
             "JOIN Contacts CON ON C.Court_ID = CON.Court_ID "+
             "JOIN Contact_type CONT ON CON.Court_Contact_Type_ID = CONT.Court_Contact_Type_ID " +
             "WHERE C.Court_ID = '3' "+ // I assume the search criteria will be different
             "ORDER BY C.Court_ID"; // Very important: records for the same court must be together

...
string last_id = string.Empty;
while (myDataReader.Read())
{
    string court_id = myDataReader["Court_ID"].ToString();
    string court_name = myDataReader["Court_Name"].ToString();
    string court_town = myDataReader["Town"].ToString();
    string court_pcode = myDataReader["Postcode"].ToString();
    string court_note = myDataReader["Note"].ToString();
    string court_contact_name = myDataReader["Contacts_Name"].ToString();
    string court_contact_desc = myDataReader["Court_Contact_Type_Desc"].ToString();
    string court_contacts_no = myDataReader["Contacts_no"].ToString();
    if (last_id != court_id) {
        // Write court AND contact
        Response.Write("<strong>" + court_name + "</strong><br>" + court_town + "<br>" + court_pcode + "<p>" + court_note + "</p>" + "<p>" + court_contact_name + " - " + court_contact_desc + " : " + court_contacts_no + "</p>");
    } else {
        // Write only contact
        Response.Write("<p>" + court_contact_name + " - " + court_contact_desc + " : " + court_contacts_no + "</p>");
    }
    last_id = court_id;
}
于 2012-12-20T11:29:39.907 回答
0

你可能想试试这个(如果我猜对了你想要展示的内容)。我假设联系方式和联系方式是 1:1 链接。

SELECT Court_Name, Town, Postcode, Note, contacts
    from Court
    where Court_ID = '3'
    CROSS APPLY
    (
    select substring((
        SELECT ',' + Contact_Name+ ' ' +Contacts_no + ' ' + Court_Contact_Type_Desc 
        FROM Contacts join Contact_Type on  Contacts.Court_Contact_Type_ID = Contact_Type.Court_Contact_Type_ID  
        WHERE Contacts.CourtID = Court.CourtID
        FOR XML PATH('')
        ),2,1000)
        as Contacts    
    ) contacts

Tho,这将使您在 C# 中解析数据,然后在您的代码中编写。

于 2012-12-20T11:28:15.913 回答
0

最直接的方法是将其拆分为 2 个查询。

第一个查询:获取具有指定 ID 的法院。
第二个查询:获取具有指定 ID 的法院联系人列表。

好的一面是它使事情变得简单易懂。而且,如果没有找到联系人(我不知道可能性有多大),您仍然可以输出正确的法院地址。

不利的一面是您向数据库发起了两个 SQL 查询。这可能是一个考虑性能的明智之举。

当心:如果您通过连接示例中的字符串来进行 SQL 查询……请注意 SQL 注入攻击!请参阅:SQL 注入和参数化查询

于 2012-12-20T12:07:48.840 回答