【问题标题】:joining two select queries results in one row for each value?加入两个选择查询会导致每个值在一行中?
【发布时间】:2012-05-26 16:33:27
【问题描述】:

我有一个名为CharUser 的表有以下数据

UserID UserName UserPhone UserAddress

还有一个名为subscriptionjob的表

subID userId   companyid

另一个名为用户UsersCvs的表有以下数据

CVId   Companyuserid   cvpath

我想对每一行进行如下查询

userid   username   userphone  useraddress usercv

用户 ID 来自 subcriptionjob 表 我尝试了以下 第一个查询

SELECT        CharUserId, CharUserName, CharUserPassword, CharUserMail, CharUserPhone, CharUserAddress, CharUserGender, ProgId, CharUserBirthdate
FROM            CharUser
WHERE        (CharUserId IN
                             (SELECT        CompanyUserId
                                FROM            SubsciptionJob
                                WHERE        (JobId = 1)))

这是第二个查询

SELECT        TOP (1) CvPath
FROM            UsersCvs
WHERE        (CompanyUserId IN
                             (SELECT        CompanyUserId
                                FROM            SubsciptionJob AS SubsciptionJob_1
                                WHERE        (JobId = 1)))
ORDER BY CvId DESC

两者都可以单独工作 我试图将它们结合起来,但它不起作用

我想将 cvpath 列附加到第一个查询中,每行都有一个唯一值

有什么想法吗?

谢谢

【问题讨论】:

  • 你不需要联合,你需要两个结果集之间的连接。
  • CompanyUserID 和 CharUserID 是同一个东西吗?为什么不在整个模型中一致地称它为 UserID 呢?为每一列加上它来自的表名的前缀通常会产生与预期相反的效果 - 它使您的代码更少自我记录。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

一种方法:

SELECT CharUserId
     , CharUserName
     , CharUserPassword
     , CharUserMail
     , CharUserPhone
     , CharUserAddress
     , CharUserGender
     , ProgId
     , CharUserBirthdate
     , (SELECT TOP (1) CvPath
       FROM UsersCvs
       WHERE CompanyUserId IN (SELECT CompanyUserId
                               FROM SubsciptionJob
                               WHERE JobId = 1)
       ORDER BY CvId DESC) AS CvPath    
FROM CharUser
WHERE CharUserId IN (SELECT CompanyUserId
                     FROM  SubsciptionJob
                     WHERE JobId = 1)

【讨论】:

    【解决方案2】:

    这比上面的答案更有效:

    SELECT CharUserId, 
           CharUserName, 
           CharUserPassword, 
           CharUserMail, 
           CharUserPhone, 
           CharUserAddress, 
           CharUserGender, 
           ProgId, 
           CharUserBirthdate,
           (SELECT TOP (1) CvPath FROM UsersCvs c where c.CompanyUserID=X.CharUserID
           FROM CharUser X
           WHERE (CharUserId IN 
                               (SELECT CompanyUserId FROM SubsciptionJob 
                                WHERE (JobId = 1)))
    

    在订阅表和 CharUser 表之间使用内连接可能会更有效。

    【讨论】:

    • 我猜你想加入 SubscriptionJob 表,然后优化性能。我没有在我的回答中这样做,因为这不是重点,但在您的编辑中,您的帖子似乎忘记了一些“内容”,因为实际上缺少一些东西所以它不起作用。
    【解决方案3】:

    使用ROW_NUMBER()

    SELECT CharUserId, CharUserName, CharUserPassword, CharUserMail, 
        CharUserPhone, CharUserAddress, 
        CharUserGender, ProgId, CharUserBirthdate,cvpath
    FROM CharUser CU
    JOIN subscriptionjob SJ ON SJ.UserId = CU.UserID
    INNER JOIN 
    (   SELECT cvpath,Companyuserid,
        ROW_NUMBER() OVER (PARTITION BY A.Companyuserid ORDER BY A.CVID DESC) X
        FROM UsersCvs A
    )R ON R.X = 1 AND CU.UserID = R.Companyuserid
    WHERE JobId = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多