c# - 如何从除第一列之外的所有列中仅选择一行

标签 c# asp.net sql-server

这样的事情可能吗?对于我尝试制作的应用程序,用户可以为单个联系人输入多个(或不输入)电子邮件、电话号码和地址,但是在首页上,我只想显示第一个 em> 电话号码、电子邮件地址以及每位联系人的地址(如果有的话)。

这是我用于检索数据的 SQL 查询(请注意,为了便于阅读,对其进行了轻微修改。实际上,我不会查询 SQL 来获取 cookie。):

SELECT TC.FirstName + ' ' + TC.LastName AS FullName, TCE.EmailAddress, TCPN.PhoneNumber, TCA.[Address] + ", " + TCA.City + ', ' + TCA.[State] + ', ' + TCA.ZipCode AS FullAddress, TC.Notes
FROM TContacts                  AS TC
INNER JOIN TContactEmails       AS TCE ON TCE.ContactID = TC.ContactID
INNER JOIN TContactPhoneNumbers AS TCPN ON TCPN.ContactID = TC.ContactID
INNER JOIN TContactAddresses    AS TCA ON TCA.ContactID = TC.ContactID
INNER JOIN TUserContacts        AS TUC ON TUC.ContactID = TC.ContactID
INNER JOIN TUsers               AS TU ON TU.UserID = TUC.UserID
WHERE TU.UserName = userCookie.Values["UserName"]

所需的结果类似于使用 SELECT TOP 1 而不仅仅是 SELECT,但是我无法具体执行此操作,因为那样它只会显示第一个联系人(全名)。我需要查看每个姓名,但不是每个完整地址、电话号码或电子邮件地址。

以下信息适用于是否存在与 SQL 查询无关的其他解决方案。

此 SQL 查询正在使用 ASP.NET 和 C# 代码的网页中使用,并通过 ADO.NET 命令调用。调用查询后,所有使用的表都会加载到 DataAdapter 对象中,并用于动态填充 ListView。下面是代码(省略了 sqlStatement,因为它基本上已在上面列出):

        SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["CPDM_NightingaleAConnectionString"].ConnectionString);
        SqlCommand comm = new SqlCommand(sqlStatement, conn);

        comm.CommandType = CommandType.Text;
        comm.Connection = conn;

        conn.Open();

        SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);
        DataSet ds = new DataSet();
        dataAdapter.Fill(ds, "TUsers, TUserContacts, TContactAddresses, TContactPhoneNumbers, TContactPhoneNumbers, TContactEmails, TContacts");
        lvContacts.DataSource = ds.Tables[0];
        lvContacts.DataBind();

        conn.Close();

ListView 的 ASP.NET 代码根据值动态创建一个表,如下所示:

    <asp:ListView ID="lvContacts" runat="server">
        <ItemTemplate>
            <tr>
                <td><asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("FullName") %>' /></td>
                <td><asp:LinkButton ID="LinkButton2" runat="server" Text='<%# Eval("EmailAddress") %>' /></td>
                <td><asp:LinkButton ID="LinkButton3" runat="server" Text='<%# Eval("PhoneNumber") %>' /></td>
                <td><asp:LinkButton ID="LinkButton4" runat="server" Text='<%# Eval("FullAddress") %>' /></td>
                <td><asp:LinkButton ID="LinkButton5" runat="server" Text='<%# Eval("Notes") %>' /></td>
            </tr>      
        </ItemTemplate>
    </asp:ListView>

这绝不是此类功能的最优雅的实现,但就目前情况而言,我对我正在使用的任何工具都不是专家。任何有关此主题的帮助将不胜感激。

作为附录,如果有人碰巧知道如何在 SQL SELECT 语句中间添加换行符(该语句在转换为 HTML 时会显示),那么这对于组织 FullAddress 将非常有用。 CHAR(10) + CHAR(13) 似乎没有做任何有值(value)的事情。

最佳答案

您可以使用子查询,这通常适用于这些类型的查找:

SELECT TC.FirstName + ' ' + TC.LastName AS FullName, 
(SELECT TOP 1 EmailAddress FROM TContactEmails WHERE ContactID = TC.ContactID) AS EmailAddress, 
(SELECT TOP 1 PhoneNumber FROM TContactPhoneNumbers WHERE ContactID = TC.ContactID) AS PhoneNumber,
(SELECT TOP 1 [Address] + ", " + City + ', ' + [State] + ', ' + ZipCode FROM TContactAddresses WHERE ContactID = TC.ContactID) AS FullAddress, 
TC.Notes
FROM TContacts                  AS TC
INNER JOIN TUserContacts        AS TUC ON TUC.ContactID = TC.ContactID
INNER JOIN TUsers               AS TU ON TU.UserID = TUC.UserID
WHERE TU.UserName = userCookie.Values["UserName"]

或者,在表中使用“默认” bool 值,让输入数据的用户保存其默认地址、电话号码等。

关于c# - 如何从除第一列之外的所有列中仅选择一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36804567/

相关文章:

c# - SignalR 或 Redis pubsub 用于 Azure 上的缩放发布者和缩放订阅者

javascript - 我如何在asp.net中调用Jquery AJAX外部URl?

c# - 比较 2 字符串

java - 查看tomcat服务器的连接数

sql - 我可以使用 SQL 在下面给出的示例表中查找缺失的数字吗?

c# - 在 Entity Framework 6 中使用自定义约定控制列映射

c# - Generic List Contains() 性能和替代方案

asp.net - 加载大页面时 Internet Explore 没有响应

sql - SQL 中长时间运行更新期间的并发性

c# - 如何在 iTextSharp 中创建目录