1

我们有两个表,我需要在一个列(此时,我无法更改该列中使用的方式/值)没有使用相同值的位置加入。因此,根据第一个表中列的值,我需要在第二个表中加入/选择特定值。这是我正在尝试做的一个示例(显然不起作用):

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 尝试过这个,但我似乎无法让它工作。这样的事情可能吗?

4

3 回答 3

4

CASE语句用于返回一个值,而不是执行操作

也将最后一个更改END CASE为 just 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
于 2012-05-09T20:00:47.553 回答
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;
于 2012-05-09T20:02:54.800 回答
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'

你不必像我一样给它们起别名——它只是有助于提高可读性。

于 2012-05-09T20:09:11.180 回答