这样的事情还能做吗?对于我试图制作的应用程序,用户可以为单个联系人输入多封(或否)电子邮件、电话号码和地址,但是在首页上,我只想显示每个联系人的第一个电话号码、电子邮件地址和地址(如果有)。
下面是用于检索数据的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,但是我不能具体地这样做,因为它只显示第一个联系人(FullName)。我需要查看每个名称,但不是每个FullAddress、PhoneNumber或EmailAddress。
如果有另一种解决方案与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();ASP.NET代码用于ListView动态创建一个基于值的表,如下所示:
<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>这绝不是这样的特性的最优雅的实现,但就其现状而言,我并不是我所使用的任何工具的专家。如能就这一问题提供任何帮助,将不胜感激。
作为一个补充,如果有人碰巧知道如何在SELECT语句的中间添加一个行分隔符,这将在转换为HTML时显示出来,这对于组织FullAddress非常有用。CHAR(10) + CHAR(13)似乎没有做任何有价值的事情。
发布于 2016-04-22 23:40:00
您可以使用一个子查询,该子查询通常适合这些类型的查找:
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"]或者,在表中使用“默认”布尔值,让输入数据的用户保存他们的默认地址、电话号码等。
发布于 2016-04-22 23:09:53
您可以使用交叉连接(而不是内部连接)为每个联系人选择第一个电话,如下所示
select TC.*, pho.Phone, adr.[Address]
from TContact AS TC
outer apply (select top 1 phone
from TContactPhoneNumbers
where ContactID = TC.ContactID) AS pho
outer apply (select top 1 [address]
from TContactAddresses
where ContactID = TC.ContactID) AS adr
outer apply (select top 1 [UserName]
from TUserContacts
where ContactID = TC.ContactID) AS uc
outer apply (select top 1 [UserName]
from TUsers
where UserId = uc.UserID) AS u
where u.UserName = what ever .....加上你看到的其他桌子..。
https://stackoverflow.com/questions/36804567
复制相似问题