代码之家  ›  专栏  ›  技术社区  ›  rockstardev

SQL查询:将两个字段从两个单独的行中联接起来

  •  1
  • rockstardev  · 技术社区  · 16 年前

    我有以下两张表:

    USER
    FID  UID     VALUE
    4    3       John
    3    3    Doe
    4    4       Jack
    3    4       Russel
    

    应该非常清楚,fid 3=姓氏,fid 4=名称。

    DATEDATA
    UID  DATE  
    3    1234
    4    4321
    

    我想把这两张桌子连起来,这样我就得到了这样的结果:

    UID  DATE  NAME   SURNAME
    3    1234  John   Doe
    4    4321  Jack   Russel
    

    或者…或者…

    UID  DATE  FULLNAME
    3    1234  John Doe
    4    4321  Jack Russel
    

    有SQL专家吗?

    这就是我目前为止所拥有的:

    SELECT UID, DATE, VALUE 
        from DATEDATA as D 
        left join USER as U 
        on U.uid = D.uid where fid = 3 OR fid = 4
    

    但这给了我:

    UID  DATE  VALUE
    3    1234  Doe
    3    1234  John
    4    4321  Russel
    4    4321  Jack
    

    有人吗?

    4 回复  |  直到 12 年前
        1
  •  6
  •   jkelley    16 年前
    SELECT D.UID, DATE, U.VALUE + ' ' + U2.Value as fullName
    from DATEDATA as D 
    left join USER as U on U.uid = D.uid and U.fid = 3
    left join USER as U2 on U2.uid = D.uid and U2.fid = 4
    

    尽管这可以在第一个或最后一个为空时为您提供一个空名称。在这种情况下,如果您可以接受用户在系统中只有一个名称或另一个名称的情况,那么您可能希望使用isull使其中一个名称成为空字符串。

        2
  •  0
  •   shahkalpesh    16 年前
    SELECT A.UID, DATEDATA.DATE, A.VALUE, B.VALUE from DATEDATA, USER A, USER B 
    WHERE A.UID = B.UID AND A.FID = 3 AND B.FID = 4 AND DATEDATA.UID = A.UID
    
        3
  •  0
  •   Jeff Meatball Yang    16 年前
    select 
      D.UID
    , D.DATE
    , isnull(U.VALUE, '') 'firstName'
    , isnull(U2.VALUE, '') 'surName'
    from
      DateData D
    left join User U on U.uid = D.uid and U.fid = 3
    left join User U2 on U2.uid = D.uid and U2.fid = 4
    
        4
  •  0
  •   gjutras    16 年前

    您可以使用如下内容。它假定您总是有名字。如果您总是有一些字段,但它不是名字,请将其设为第一个,然后重新调整联接。如果你从来没有保证过价值,那就告诉我们,我们会努力解决。

    select d.uid,COALESCE(d.date,'none entered'),COALESCE(frst.value,'') as NAME,COALESCE(lst.value,'') as SURNAME
    from
    user frst (NOLOCK)
    left join user lst (NOLOCK) on lst.uid=frst.uid
    left join datedata d (NOLOCK) on d.uid = frst.uid
    where
    frst.fid=4
    AND lst.fid=3
    
    推荐文章