加入麻烦

时间:2016-01-21 13:19:28

标签: sql sql-server-2008-r2

我试图从几个表中提取数据,其中一个表具有一对多的关系。我的SQL看起来像这样:

SELECT 
  VU.*, 
  UI.UserImg, 
  COALESCE(CI.Interests, 0) as NumInterests 
FROM [vw_tmpUsers] VU 
LEFT JOIN (
  SELECT 
    [tmpUserPhotos].UserID, 
    CASE WHEN MAX([tmpUserPhotos].uFileName) = NULL 
    THEN 'dflt.jpg'
    ELSE Max([tmpUserPhotos].uFileName) 
     END as UserImg 
  FROM [tmpUserPhotos] 
  GROUP BY UserID) UI 
ON VU.UserID = UI.UserID 

我已经排除了一系列LEFT JOINS,因为它们都正常工作。

我的麻烦是,我只想从具有一对多关系的表中提取一个图像名称。为此,我使用了MAX函数。

我想要的结果如下:

UserID  UserName    UserState   UserZip UserIncome  UserHeight  UserImg
1       Jimbo       NY          10012   2           64          1[Blue hills.jpg
2       Jack        MA          06902   3           66          dflt.jpg
3       Lisa        CT          06820   4           64          dflt.jpg
4       Mary        CT          06791   6           67          4[Natalie.jpg
5       Wanda       CT          06791   6           67          dflt.jpg

但它看起来像这样:

UserID  UserName    UserState   UserZip UserIncome  UserHeight  UserImg
1       Jimbo       NY          10012   2           64          1[Blue hills.jpg
2       Jack        MA          06902   3           66          NULL
3       Lisa        CT          06820   4           64          NULL
4       Mary        CT          06791   6           67          4[Natalie.jpg
5       Wanda       CT          06791   6           67          NULL

在我的CASE声明中,它必须是不可思议的,但我对它们并不是很好。我尝试过使用IS NULL,= NULL,=' NULL',一切都无济于事。

有人能发现我做错了什么吗?一个可能散发光线的小花絮;如果tmpUserPhotos中没有匹配的记录,则MAX(tmpUserPhotos.uFileName)将仅返回NULL。

4 个答案:

答案 0 :(得分:3)

您需要在外部查询中检查LEFT JOIN

SELECT

您获得了OUTER APPLY个值,因为LEFT JOIN没有匹配项。没有匹配意味着没有对任何数据执行exports.get_refresh_token = function(authorization_code) { var Buffer = require('buffer').Buffer; var buf = new Buffer(PAYPAL_CLIENT_ID + ':' + PAYPAL_SECRET, 'utf8'); var basicAuthString = "Basic " + buf.toString('base64'); return Parse.Cloud.httpRequest({ method:"POST", url: API_SERVER + "/v1/oauth2/token", headers: { "Authorization":basicAuthString, "Content-Type": "application/x-www-form-urlencoded", "Accept-Language": "en_US" }, body: 'grant_type=authorization_code&response_type=token&redirect_uri=urn:ietf:wg:oauth:2.0:oob&code=' + authorization_code }).then(function(httpResponse) { var res = JSON.parse(httpResponse.text); console.log('response: ' + httpResponse + ' res: ' + res + ' at ' + res.access_token + ' rt ' + res.refresh_token); return Parse.Promise.as(res); }, function(httpResponse) { console.error("Request failed " + httpResponse.text + ' : ' + authorization_code + ' ' + API_SERVER); return Parse.Promise.error('Unable to get refresh token'); }); }

我还要注意,如果您偏好图片的优先级,那么var length = 4; // example values var depth = 8; // example values var toal = compute(length, depth); total更容易。但是,这将是另一个问题。

答案 1 :(得分:2)

而不是case语句,尝试'isnull'函数...

isnull(MAX([tmpUserPhotos].uFileName),'dflt.jpg') as UserImg

答案 2 :(得分:1)

查看<with variable="activePartId"> <equals value="org.eclipse.ui.navigator.ProjectExplorer"/> </with> 运算符和TOP的使用情况。

subquery

答案 3 :(得分:1)

即使您已对其进行检查,CASE表达式返回空值的原因是表达式WHEN MAX([tmpUserPhotos].uFileName) = NULL永远不会评估为真,即使MAX([tmpUserPhotos].uFileName) 1}} null。

这是因为空值是SQL中一种特殊类型的值,其中一个意味着&#34;值未知&#34; - 几乎所有与null值的比较都计算为null,而不是true或false。

因此,您需要使用coalesceisnull等函数来检查表达式是否为null;或者,您可以修改您的案例条件以测试表达式is null,如此:

CASE WHEN MAX([tmpUserPhotos].uFileName) IS NULL 
    THEN 'dflt.jpg'
    ELSE Max([tmpUserPhotos].uFileName) 
 END as UserImg