0

首先为毛茸茸的主题标题道歉,很难用言语表达。

所以……考虑到这一点,我附上了一个数据库关系图(见下文),希望能更简洁地解释它。

在此处输入图像描述

我们继承了一个大型数据库(因此无法更改/合理化它,更遗憾的是!)它有一个麻烦的“循环”,由 4 个表组成,其中有几个不同的多对多关系。

我需要能够得到法院的名称、完整地址和一般说明,所有这些每个法院都只有一个,然后是联系方式,它们分为两组(一般联系点和特定联系点),可以包含一个或多个取决于法院的清单。我需要它以以下格式显示:

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

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

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

我昨天在 StackOverflow 上发布了如何为一对多关系正确编写 SQL 查询和 ASP.NET C# 代码。为简单起见,我提供的信息经过大量解释,基本上只包含您在上面看到的循环的一半。但是,此后我尝试将相同的原则应用于整个循环失败了。

SQL 查询(适用于循环的前半部分,即提供法院地址详细信息和特定联系人列表)如下所示:

string myQuery = 
"SELECT C.court_id, court_name, court_addr1, court_town_name, court_county_name, " +
"court_country_name, court_addr_pcode, court_addr_dx, court_code, court_note, " +
"court_contacts_name, court_contacts_no, CCT.court_contact_type_desc " +      
"FROM court C " +
"JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id " +
"JOIN court_town CT ON CA.court_town_id = CT.court_town_id " +
"JOIN court_county CC ON CT.court_county_id = CC.court_county_id " +
"JOIN court_country CCO ON CC.court_country_id = CCO.court_country_id " +
"JOIN court_contacts CCON ON C.court_id = CCON.court_id " +
"JOIN court_contact_type CCT ON CCON.court_contact_type_id = CCT.court_contact_type_id " + 
"WHERE C.court_id = '25' " + 
"ORDER BY C.court_id";

虽然 C# 看起来像这样:

if (myDataReader.HasRows)
{

    string last_id = string.Empty;

    while (myDataReader.Read())
    {

        string court_id = myDataReader["court_id"].ToString();
        string court_name = myDataReader["court_name"].ToString();
        string court_addr = myDataReader["court_addr1"].ToString();
        string court_town = myDataReader["court_town_name"].ToString();
        string court_county = myDataReader["court_county_name"].ToString();
        string court_country = myDataReader["court_country_name"].ToString();
        string court_pcode = myDataReader["court_addr_pcode"].ToString();
        string court_dx = myDataReader["court_addr_dx"].ToString();
        string court_code = myDataReader["court_code"].ToString();
        string court_note = myDataReader["court_note"].ToString();
        string court_contact_name = myDataReader["court_contacts_name"].ToString();
        string court_contact_desc = myDataReader["court_contact_type_desc"].ToString();
        string court_contact_no = myDataReader["court_contacts_no"].ToString();

        if (last_id != court_id) {

            Response.Write("<strong>" + court_name + "</strong><br>" + court_addr +
                           "<br>" + court_town + "<br>" + court_county + "<br>" + 
                           court_country + "<br>" + court_pcode + "<br><br>" + 
                           court_dx + "<br><p>Court code " + court_code + "</p><p>" + 
                           court_note + "</p>" + court_contact_name + " - " + 
                           court_contact_desc + ": " + court_contact_no + "<br>");

        } else {

            Response.Write("<br>" + court_contact_name + " - " + court_contact_desc + 
                           ": " + court_contact_no + "<br>");

        }

        last_id = court_id;

    }

}

按照 SQL 查询中的相同逻辑,我尝试添加一个额外的 SELECT 参数court_contacts_general_no和几个额外的 JOIN 行以引入court_contacts_general表(见下文),但是,这会产生类似于“相关性”的错误在 FROM 子句中多次指定名称 CCG,或者如果删除了第二个相关名称,则完全空白。

"JOIN court_contacts_general CCG ON C.court_id = CCG.court_id " +                                  
"JOIN court_contacts_general CCG ON CCT.court_contact_type_id = CCG.court_contact_type_id " +

在 C# 中,我为court_contact_general_no添加了一个新字符串,并尝试根据写入从这个新变量收到的响应创建另一个 if/else 循环。

无论哪种方式,我得到的只是一个大的空白页或上面的 SQL 相关错误。

有任何想法吗?

提前感谢所有/任何帮助。

4

2 回答 2

0

您需要使用不同的表名别名才能在单个查询中多次加入同一个表

JOIN court_contacts_general CCG1
JOIN court_contacts_general CCG2.. etc

我建议将表命名为与返回的数据更相关的名称,但在这种情况下

于 2012-12-21T14:34:48.750 回答
0

它当然不优雅(毫无疑问,有更好的编写方式!)但我已经设法通过编写第二个 SQL 查询并在第一个 SQL 连接关闭标记后直接打开第二个 Sqlconnection 来解决该问题关于第二批联系人。

SQL查询:

string myQuery2 = 
"SELECT C.court_id, court_contacts_name, court_contacts_no, court_contact_type_desc " +
"FROM court C " +
"JOIN court_contacts CCON ON C.court_id = CCON.court_id " +
"JOIN court_contact_type CCT ON CCON.court_contact_type_id = CCT.court_contact_type_id " +
"WHERE C.court_id = '" + court_id_no + "' " +
"ORDER BY C.court_id";

C#代码:

myDataReader.Close();
connection.Close();

SqlConnection connection2 = new SqlConnection(connStr);
SqlCommand myCommand2 = new SqlCommand(myQuery2, connection2);
SqlDataReader myDataReader2;
connection2.Open();

myDataReader2 = myCommand2.ExecuteReader();

if (myDataReader2.HasRows) {

    string last_id = string.Empty;

    while (myDataReader2.Read()) {

        string court_id = myDataReader2["court_id"].ToString();
        string court_contact_desc = myDataReader2["court_contact_type_desc"].ToString();
        string court_contact_name = myDataReader2["court_contacts_name"].ToString();
        string court_contact_no = myDataReader2["court_contacts_no"].ToString();

        if (string.IsNullOrWhiteSpace(court_contact_no)) {
            court_contact_no = generic_contact_no;
        }

        if (last_id != court_id) {

            Response.Write(court_contact_name + " - " + court_contact_desc + ": " + court_contact_no + "<br>");

        } else {

            Response.Write(court_contact_name + " - " + court_contact_desc + ": " + court_contact_no + "<br>");

        }

        last_id = court_id;

    }
}

正如我所说,不漂亮,但重要的是它有效。

于 2012-12-21T16:58:48.683 回答