首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在除第一列之外的所有列中只选择一行

如何在除第一列之外的所有列中只选择一行
EN

Stack Overflow用户
提问于 2016-04-22 22:59:22
回答 2查看 107关注 0票数 2

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

下面是用于检索数据的SQL查询(请注意,为了提高可读性,对其做了一些修改。实际上,我并不是在查询SQL中的cookie。):

代码语言:javascript
复制
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省略了,因为它实际上是上面列出的):

代码语言:javascript
复制
        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动态创建一个基于值的表,如下所示:

代码语言:javascript
复制
    <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)似乎没有做任何有价值的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 23:40:00

您可以使用一个子查询,该子查询通常适合这些类型的查找:

代码语言:javascript
复制
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"]

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

票数 4
EN

Stack Overflow用户

发布于 2016-04-22 23:09:53

您可以使用交叉连接(而不是内部连接)为每个联系人选择第一个电话,如下所示

代码语言:javascript
复制
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 .....

加上你看到的其他桌子..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36804567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档