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;