T-SQL Join - 需要根据条件返回一行

时间:2015-12-31 01:54:26

标签: sql sql-server join

对标题感到抱歉,但我不知道如何正确解释。

我有两张桌子(简化用于解释):

Response_Comments:

RES_ID|Comment
------|-------
1     |Test 1
2     |Test 2
{ANY} |Test 3

回复

UK|  Name  |RES_ID
--|--------|------
1 |Greg    |1
2 |Bob     |4
3 |Jane    |2

我编写了一个SQL查询来连接RES_ID上的那些表,以将Comments列附加到Responses表。但是,我想在Response中找到任何没有相应RES_ID的内容来获取 {ANY} RES_ID。

我的查询基本上是:

SELECT r.*, rc.comments
FROM Responses r
LEFT JOIN Response_Comments rc
ON r.RES_ID LIKE rc.RES_ID --LIKE, otherwise it complains about int vs varchar
OR r.RES_ID = '{ANY}'

但是,这会返回每人两行:

UK|  Name  |RES_ID|Comments
--|--------|------|---------
1 |Greg    |1     |Test 1
1 |Greg    |1     |Test 3
2 |Bob     |4     |Test 3
3 |Jane    |2     |Test 2
3 |Jane    |2     |Test 3

我本质上想让我的查询只返回每人一行,如果RES_ID存在则使用相应的Comment,否则使用{ANY} RES_ID注释。

在我的实际查询中,我加入了大约4/5个其他表,并且有其他条件,我的Response_Comments将有多个 {ANY} RES_ID,但还有其他列这将限制它。

我希望一切都有道理,我很难过。顺便说一句,这是Transact-SQL,也许我需要一些CASE的东西?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

JOIN中使用两个COALESCE()SELECT

SELECT r.*, COALESCE(rc.comments, rcany.comments) as comments
FROM Responses r LEFT JOIN
     Response_Comments rc
     ON r.RES_ID LIKE rc.RES_ID LEFT JOIN
     Response_Comments rcany
     ON rcany.RES_ID = '{ANY}';

您应修复数据结构,以使连接键具有相同的类型。 SQL实现外键关系以维护表之间的关系完整性。应定义外键,并且它们要求类型相同。