这样的事情可能吗?对于我尝试制作的应用程序,用户可以为单个联系人输入多个(或不输入)电子邮件、电话号码和地址,但是在首页上,我只想显示第一个 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/