【发布时间】:2013-12-27 15:02:42
【问题描述】:
我必须使用一个不完美的模型,因为两个不同的表应该只有一个......让我们简化模型并展示它:
Table: Survey
Columns: ID_SURVEY | SURVEY_TYPE | SURVEY_QUESTIONS
Table: SurveySent
Columns: ID_SENT | ID_USER | ID_SURVEY | TMST_SENT
Table: SurveyAnswered
Columns: ID_RECEIVED | ID_USER | ID_SURVEY | TMST_RECEIVED | ANSWERS
-- the first column is the primary key, columns wiht same name are foreign keys
现在,如果我构建了模型,SurveyAnswered 和 SurveySent 将是同一个表,因为只有在首先发送调查时才存在已回答的调查,或者至少根据已发送的调查回答调查。
但事实并非如此,所以我试图通过一个查询获得结果,希望是高效的,因为我不会写任何东西。
我想要得到的是用户收到的调查数量,用户回答的调查数量,所有这些都是针对一种特定类型的调查。经过多次尝试,我设法做到这一点的唯一方法是加入两个子查询:
SELECT Z.ID_USER, COUNT(DISTINCT ID_SENT), COUNT(DISTINCT ID_RECEIVED) FROM
(SELECT A1.ID_USER, A1.ID_SENT
FROM SurveySent A1
JOIN Survey B ON A1.ID_SURVEY = B.ID_SURVEY
WHERE B.SURVEY_TYPE = @MyType) AS Z
LEFT JOIN
(SELECT A2.ID_USER, A2.ID_RECEIVED
FROM SurveyAnswered A2
JOIN Survey B ON A2.ID_SURVEY = B.ID_SURVEY
WHERE B.SURVEY_TYPE = @MyType) AS Y
ON Z.ID_USER = Y.ID_USER
GROUP BY Z.ID_USER
有没有办法用一个查询(不是一个有 2 个子查询)来做到这一点?问题的核心似乎是我想同时加入两列:ID_SURVEY 和 ID_USER 但我还没有找到在单个查询中执行此操作的方法...
比如:
SELECT A1.ID_USER, COUNT(DISTINCT ID_SENT), COUNT(DISTINCT ID_RECEIVED)
FROM SurveySent A1
LEFT JOIN SurveyAnswered A2 ON A1.ID_USER=A2.ID_USER
JOIN Survey B ON B.ID_SURVEy = A1.ID_SURVEY
WHERE B.SURVEY_TYPE = @MyType
AND (A2.ID_SURVEY = B.ID_SURVEY OR A2 IS NULL)
GROUP BY A1.ID_USER
不工作,因为左连接后空值丢失......有什么帮助吗?
【问题讨论】: