根据下面的查询,dps_markers中可能有多个行具有相同的标记键,但我们只想连接第一个行。如果我接受此查询并删除前1和ORDER BY,我得到了mbg.marker_value的值,但按原样运行时总是返回null
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'
发布于 2010-01-10 02:19:50
使用外部应用而不是左连接:
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。
发布于 2010-01-10 00:38:35
调试这些情况的关键是单独运行子查询/内联视图来查看输出是什么:
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
值与u162231993
的u.id
值不匹配,这就解释了为什么所有mbg
引用都会返回null
(这要归功于左连接;如果它是一个内部连接,则不会得到任何结果)。
您已经使用TOP
编写了自己的代码,因为如果您想要为其他用户运行查询,则必须调整查询。更好的方法是:
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
值,以检查系统中任何用户的记录。
发布于 2010-01-09 22:54:35
因为来自顺序子查询的TOP 1
没有profile_id = 'u162231993'
,所以删除where u.id = 'u162231993'
并查看结果。
单独运行子查询以了解发生了什么。
https://stackoverflow.com/questions/2033699
复制相似问题