我需要连接两个表,其中列(此时,我无法更改该列中使用的值/值)不使用相同的值。因此,根据第一个表中列的值,我需要在第二个表中加入/选择一个特定值。这是我想要做的一个例子(显然不起作用):
SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
CASE
WHEN Alert.ObjectType = 'U' THEN Comments.ObjectType = 'USER'
WHEN Alert.ObjectType = 'E' THEN Comments.ObjectType = 'EVENT'
END CASE
所以我想要Alert表中的所有内容,如果Comments表中有相应的记录,我也想要那些。但仅限于适当/匹配的ObjectType。
我已经尝试使用CASE和IF,但我似乎无法让它工作。这样的事情可能吗?
答案 0 :(得分:4)
CASE
语句是返回一个值,而不是执行操作。
同时将最后END CASE
更改为END
。
使用返回的值与连接条件进行比较。
尝试:
SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Comments.ObjectType =
CASE Alert.ObjectType
WHEN 'U' THEN 'USER'
WHEN 'E' THEN 'EVENT'
END
答案 1 :(得分:0)
为什么不呢:
SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Alert.ObjectType = LEFT(Comments.ObjectType, 1);
看起来好多了......
修改强>
根据您的评论,似乎并非所有“匹配”值都以相同的字母开头。在这种情况下,我建议设计一个包含AlertType char(1)和CommentType varchar(50)列的中间表。插入TypeId的每个组合,如U,User; E,事件;您可以修改SQL以阅读
SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Intermediate i on Alert.ObjectType = i.AlertType
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Comments.ObjectType = i.CommentType;
答案 2 :(得分:0)
我建议您使用UNION处理此问题。在一个联合中,用户注释另一个事件评论:
SELECT Alert.*, userComments.Comment
FROM alert
LEFT OUTER JOIN comments usercomments ON userComments.ObjectId = Alert.ObjectId AND usercomments.objecttype='USER'
WHERE alert.objecttype = 'U'
UNION
SELECT Alert.*, eventComments.Comment
FROM alert
LEFT OUTER JOIN comments eventcomments ON eventComments.ObjectId = Alert.ObjectId AND eventcomments.objecttype='EVENT'
WHERE alert.objecttype = 'E'
你不必按照我的方式对它们进行别名 - 它只是有助于提高可读性。