Как объединить сложные данные - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть схема, настроенная следующим образом:

Cards         (card_id, fact_id, fact_view_id)
data_for_fact (fact_id, key, value)

Пример данных:

  [cards]:  (51, 1, '2::1'), (52, 1, '2::2') ...
  [data_for_fact]: (1, 'q', 'person'), (1, 'a', 'noun')

Предполагаемый вывод:

 [cards]: (51, 'person' (as q), 'noun' (as a)), 
          (52, 'noun' (as q), 'person' (as a))

С SQLLite, как я могу получить результат, который я ищу?

Я пытался создать объединение, но это работает только на первой выходной карте.Разница между двумя картами заключается в идентификаторе fact_view.

1 Ответ

1 голос
/ 17 февраля 2011

Вы можете сделать это с помощью объединения:

SELECT card_id, ques.value AS q, ans.value AS a
    FROM cards
    JOIN data_for_fact AS ques 
      ON cards.fact_id=ques.fact_id AND ques.key='q'
    JOIN data_for_fact AS ans 
      ON cards.fact_id=ans.fact_id AND ans.key='a'
    WHERE cards.fact_view_id='2::1'
UNION ALL
SELECT card_id, ans.value AS q, ques.value AS a
  FROM cards
    JOIN data_for_fact AS ans 
      ON cards.fact_id=ans.fact_id AND ans.key='a'
    JOIN data_for_fact AS ques 
      ON cards.fact_id=ques.fact_id AND ques.key='q'
  WHERE cards.fact_view_id='2::2'

Или можете использовать CASE выражения:

SELECT card_id, 
       CASE cards.fact_view_id WHEN '2::1' THEN ques.value ELSE  ans.value END AS q, 
       CASE cards.fact_view_id WHEN '2::1' THEN  ans.value ELSE ques.value END AS a 
  FROM cards
    JOIN data_for_fact AS ques 
      ON cards.fact_id=ques.fact_id AND ques.key='q'
    JOIN data_for_fact AS ans 
      ON cards.fact_id=ans.fact_id AND ans.key='a'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...