首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有左连接的前1个

具有左连接的前1个
EN

Stack Overflow用户
提问于 2010-01-09 22:43:25
回答 4查看 138K关注 0票数 107

根据下面的查询,dps_markers中可能有多个行具有相同的标记键,但我们只想连接第一个行。如果我接受此查询并删除前1和ORDER BY,我得到了mbg.marker_value的值,但按原样运行时总是返回null

代码语言:javascript
复制
SELECT u.id, mbg.marker_value 
FROM dps_user u
LEFT JOIN 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     ORDER BY m.creation_date
    ) MBG ON MBG.profile_id=u.id 
WHERE u.id = 'u162231993'
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-10 02:19:50

使用外部应用而不是左连接:

代码语言:javascript
复制
SELECT u.id, mbg.marker_value 
FROM dps_user u
OUTER APPLY 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     WHERE um.profile_id=u.id 
     ORDER BY m.creation_date
    ) AS MBG
WHERE u.id = 'u162231993';

与JOIN不同,APPLY允许您在内部查询中引用u.id。

票数 223
EN

Stack Overflow用户

发布于 2010-01-10 00:38:35

调试这些情况的关键是单独运行子查询/内联视图来查看输出是什么:

代码语言:javascript
复制
  SELECT TOP 1 
         dm.marker_value, 
         dum.profile_id
    FROM DPS_USR_MARKERS dum (NOLOCK)
    JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id 
                                AND dm.marker_key = 'moneyBackGuaranteeLength'
ORDER BY dm.creation_date

运行该命令,您将看到profile_id值与u162231993u.id值不匹配,这就解释了为什么所有mbg引用都会返回null (这要归功于左连接;如果它是一个内部连接,则不会得到任何结果)。

您已经使用TOP编写了自己的代码,因为如果您想要为其他用户运行查询,则必须调整查询。更好的方法是:

代码语言:javascript
复制
   SELECT u.id, 
          x.marker_value 
     FROM DPS_USER u
LEFT JOIN (SELECT dum.profile_id,
                  dm.marker_value,
                  dm.creation_date
             FROM DPS_USR_MARKERS dum (NOLOCK)
             JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id 
                                         AND dm.marker_key = 'moneyBackGuaranteeLength'
           ) x ON x.profile_id = u.id
     JOIN (SELECT dum.profile_id,
                  MAX(dm.creation_date) 'max_create_date'
             FROM DPS_USR_MARKERS dum (NOLOCK)
             JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id 
                                         AND dm.marker_key = 'moneyBackGuaranteeLength'
         GROUP BY dum.profile_id) y ON y.profile_id = x.profile_id
                                   AND y.max_create_date = x.creation_date
    WHERE u.id = 'u162231993'

这样,您就可以更改where子句中的id值,以检查系统中任何用户的记录。

票数 4
EN

Stack Overflow用户

发布于 2010-01-09 22:54:35

因为来自顺序子查询的TOP 1没有profile_id = 'u162231993',所以删除where u.id = 'u162231993'并查看结果。

单独运行子查询以了解发生了什么。

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

https://stackoverflow.com/questions/2033699

复制
相关文章

相似问题

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