Sql 如果所请求的查询对于给定的模式来说很麻烦,ommon会在SO和其他地方建议更改模式。如果你考虑取消我的投票,我会很感激。另外,通过删除您的原始注释,您已经剥夺了后续注释的有用上下文。在我看来,您的答案没有那么有用,因为您需要一些DDL更改,而这并不像Blu
Sql 如果所请求的查询对于给定的模式来说很麻烦,ommon会在SO和其他地方建议更改模式。如果你考虑取消我的投票,我会很感激。另外,通过删除您的原始注释,您已经剥夺了后续注释的有用上下文。在我看来,您的答案没有那么有用,因为您需要一些DDL更改,而这并不像Blu,sql,pivot,Sql,Pivot,如果所请求的查询对于给定的模式来说很麻烦,ommon会在SO和其他地方建议更改模式。如果你考虑取消我的投票,我会很感激。另外,通过删除您的原始注释,您已经剥夺了后续注释的有用上下文。在我看来,您的答案没有那么有用,因为您需要一些DDL更改,而这并不像BlueFoot所示的那样绝对必要。更糟糕的是:如果你想添加一个或多个答案,你必须调整你的约束条件。当然,有很多选项可以改变初始设置,但它仍然回答了这个问题吗?我认为原始模式是不够的。代理键应该没有任何意义,蓝脚怪通过使键的顺序暗示问题的顺序来赋予它
如果所请求的查询对于给定的模式来说很麻烦,ommon会在SO和其他地方建议更改模式。如果你考虑取消我的投票,我会很感激。另外,通过删除您的原始注释,您已经剥夺了后续注释的有用上下文。在我看来,您的答案没有那么有用,因为您需要一些DDL更改,而这并不像BlueFoot所示的那样绝对必要。更糟糕的是:如果你想添加一个或多个答案,你必须调整你的约束条件。当然,有很多选项可以改变初始设置,但它仍然回答了这个问题吗?我认为原始模式是不够的。代理键应该没有任何意义,蓝脚怪通过使键的顺序暗示问题的顺序来赋予它们意义。如果这些代理键是由数据库自动生成的,则更改答案的顺序将变得更加困难,尤其是如果有其他表使用
answers.a_id
列。如果问题的顺序很重要(这很可能),那么原始模式是错误的;除非海报上写着“这是一个我无法改变的传统模式”,否则我总是会指出一个糟糕的设计。我回答的第一句话:“我会先在答案表中添加一个位置栏。”我建议对模式进行更改,原因有两个,我在第一段中概述了这些原因。好吧,我明白你的观点;但我仍然认为这与问题相去甚远,因为您更改了先决条件。如果所请求的查询对于给定的模式很麻烦,那么在SO和其他地方建议更改模式是很常见的。如果你考虑取消我的投票,我会很感激。另外,通过删除您的原始注释,您已经剥夺了后续注释的有用上下文。在我看来,您的答案没有那么有用,因为您需要一些DDL更改,而这并不像BlueFoot所示的那样绝对必要。更糟糕的是:如果你想添加一个或多个答案,你必须调整你的约束条件。当然,有很多选项可以改变初始设置,但它仍然回答了这个问题吗?我认为原始模式是不够的。代理键应该没有任何意义,蓝脚怪通过使键的顺序暗示问题的顺序来赋予它们意义。如果这些代理键是由数据库自动生成的,则更改答案的顺序将变得更加困难,尤其是如果有其他表使用answers.a_id
列。如果问题的顺序很重要(这很可能),那么原始模式是错误的;除非海报上说,“这是一个我无法更改的遗留模式”,否则我将始终指出一个糟糕的设计。三角连接聚集在子查询中的子查询中。聪明且技术上正确,但如果行数达到中等水平,可能会导致性能噩梦。我同意-如果需要良好的性能,这可能并不聪明;)检查上面的小提琴;注意,我使用了表correct_answers
,而不是correct_answer
;不再需要tweek-这适用于上面所有的分区数据库。三角连接聚合子查询中的子查询中的子查询。聪明且技术上正确,但如果行数达到中等水平,可能会导致性能噩梦。我同意-如果需要良好的性能,这可能并不聪明;)检查上面的小提琴;注意,我使用了表correct_answers
,而不是correct_answer
;不再需要tweek了-这适用于上面所有的已分区数据库。您使用的是什么数据库引擎?我读过,你需要“纯SQL”解决方案,所以你想要一些通用的东西,但是很少有SQL方言-最流行的是SQL-92、SQL-99。你使用的是什么数据库引擎?我已经读到,您需要“纯SQL”解决方案,所以您需要通用的解决方案,但是很少有SQL方言-最流行的是SQL-92、SQL-99。
result (q_id, q_text, option1, option2, option3, option4, correct)
q_id q_text
2 Capital of Pakistan is
3 Karachi is in africa
5 New dehli is _____ of india
a_id a_text q_id
1 Lahore 2
2 Islamabad 2
3 Karachi 2
4 Quetta 2
5 True 3
6 False 3
7 Capital 5
q_id a_id
2 2
3 6
5 7
q_id q_text option_1 option_2 option_3 option_4 correct
2 Capital of Pakistan is Lahore Islamabad Karachi Quetta Islamabad
3 Karachi is in africa True False null null False
5 New dehli is _____ of india Capital Null Null Null Capital
select q_id,
q_text,
max(case when rn = 1 then answer end) Option1,
max(case when rn = 2 then answer end) Option2,
max(case when rn = 3 then answer end) Option3,
max(case when rn = 4 then answer end) Option4,
CorrectAnswer
from
(
select q.q_id,
q.q_text,
a1.a_text Answer,
a2.a_text CorrectAnswer,
row_number() over(partition by q.q_id order by a1.a_id) rn
from questions q
left join answers a1
on q.q_id = a1.q_id
left join Correct_answer ca
on q.q_id = ca.q_id
left join answers a2
on ca.a_id = a2.a_id
)
group by q_id, q_text, CorrectAnswer
order by q_id
select q_id,
q_text,
Option1, Option2, Option3, Option4,
CorrectAnswer
from
(
select q.q_id,
q.q_text,
a1.a_text Answer,
a2.a_text CorrectAnswer,
row_number() over(partition by q.q_id order by a1.a_id) rn
from questions q
left join answers a1
on q.q_id = a1.q_id
left join Correct_answer ca
on q.q_id = ca.q_id
left join answers a2
on ca.a_id = a2.a_id
)
pivot
(
max(answer)
for rn in ('1' as Option1, '2' as Option2,
'3' as Option3, '4' as Option4)
) piv
order by q_id
SELECT
q.qid, q.q_text,
a1.a_text AS option1, a2.a_text AS option2,
a3.a_text AS option3, a4.a_text AS option4,
ca.a_text AS correct
FROM
Questions q
LEFT JOIN Answers a1 ON a1.q_id = q.q_id AND a1.Position = 1
LEFT JOIN Answers a2 ON a2.q_id = q.q_id AND a2.Position = 2
LEFT JOIN Answers a3 ON a3.q_id = q.q_id AND a3.Position = 3
LEFT JOIN Answers a4 ON a4.q_id = q.q_id AND a4.Position = 4
JOIN Correct_answer qca ON ca.q_id = q.q_id
JOIN Anwsers ca ON ca.a_id = qca.a_id
SELECT q_id,
q_text,
(SELECT a_text
FROM answers a1
WHERE a1.q_id = q1.q_id
AND (SELECT count(*) FROM answers a2 WHERE a1.q_id = a2.q_id AND a2.a_id < a1.a_id) = 0) as option1,
(SELECT a_text
FROM answers a1
WHERE a1.q_id = q1.q_id
AND (SELECT count(*) FROM answers a2 WHERE a1.q_id = a2.q_id AND a2.a_id < a1.a_id) = 1) as option2,
(SELECT a_text
FROM answers a1
WHERE a1.q_id = q1.q_id
AND (SELECT count(*) FROM answers a2 WHERE a1.q_id = a2.q_id AND a2.a_id < a1.a_id) = 2) as option3,
(SELECT a_text
FROM answers a1
WHERE a1.q_id = q1.q_id
AND (SELECT count(*) FROM answers a2 WHERE a1.q_id = a2.q_id AND a2.a_id < a1.a_id) = 3) as option4,
(SELECT a_text
FROM answers a1
WHERE a1.a_id = (select a_id from correct_answers c1 where c1.q_id = q1.q_id)) as correct
FROM questions q1;