2013-03-16 2 views
2

Мне нужен запрос, который выбирает кучу записей, а затем с этими записями выбирает кучу строк в одну строку. Ниже приведена типичная запись, а также типичный результат.Sqlite выбрать несколько строк в одну строку

table1 
id 
------- 
3  

table2 
id  value  table1 
-------------------------- 
5  value1  3 
6  value2  3 

table3 
id  value  table1 
------------------------- 
9  value3  3 
10  value4  3 

table4 
id  table1 
--------------- 
14  3 
15  3 

table5 
id  value  table4 
------------------------------- 
19  value5  14 
20  value6  14 
21  value7  15 


result 
result1 result2  result3  result4 
------------------------------------------------------ 
3  value1  value3  value5, value6; value7 

Необходимо использовать только первый результат из Таблицы 1 и Таблицы 2. Таблица 2 часто может быть нулевой, значение 3 должно было бы войти в result2. На данный момент я выбираю каждую запись даного, как показано ниже, который возвращает только Result1, а затем для каждой записи я делаю раздельные запросы для каждого результата

SELECT DISTINCT id FROM (
    -complicated select in here 
) AS temp; 

А затем для каждого ID сепарабельнозначный выполнить:

SELECT value FROM table2 WHERE table1 = id LIMIT 1; 

SELECT value FROM table3 WHERE table1 = id LIMIT 1; 

SELECT value, table4.id FROM table4, table5 WHERE table4.id = table5.table4 AND table1 = id; 

и используйте код, чтобы отформатировать его во что-то подобное таблице результатов.

Проблема заключается в том, что первый запрос выполняется только в фоновом потоке, а остальные - в потоке пользовательского интерфейса. Я хотел бы сделать все это в одном запросе, но у меня проблема с таблицей 4 в одной строке и только выбор первого результата table2 и table3.

+0

Как вычислить результат? Почему значения 'value2' и' value4' не отображаются? –

+0

'Таблица 2 часто может быть нулевой, значение 3 должно войти в result2'. На этом этапе вы должны спросить себя, хорош ли ваш дизайн базы данных. Здесь отсутствует простота, которая поднимает красные флаги. – Tim

+0

Но проверьте это: IFNULL http://www.sqlite.org/lang_corefunc.html#ifnull – Tim

ответ

3

Для условных отношений, таких как это, вам будет намного проще использовать несколько вариантов выбора или создать временную таблицу, заполнив ее поэтапно, а затем сделать окончательный выбор во временной таблице.

В результате вы пытаетесь денормализовать и затем перенормировать данные в таблице с помощью внешних соединений с условной логикой, возможно, это возможно, но они будут работать против зерна «мудрой» разработки базы данных и вы, вероятно, получите запрос, который невозможно отладить, если вы столкнулись с проблемами.

Я знаю, что sqlite предназначен для простой реализации стандарта SQL для использования в легких средах, поэтому я не уверен, насколько сложным может быть ваш SQL, прежде чем он попадет в неприятности.

Это не совсем ясно для меня, что вы пытаетесь достичь, но обходной путь может быть использование нескольких заявлений UNION, как это:

SELECT DISTINCT source, id FROM (
    SELECT table2.table1 AS table1, 'table2' AS source, value AS id FROM table2 
    UNION 
    SELECT table3.table1, 'table3', value FROM table3 
    UNION 
    SELECT table4.table1, 'table5', value FROM table5, table4 
    WHERE table4.id = table5.table4) 
WHERE table1 = 3; 

Тогда вы получите результат:

source | id 
----------------------- 
table2 | value1 
table3 | value3 
table4 | value5 
table4 | value6 
table4 | value7 

Другой вариант - создать представление со всеми объединениями (и всеми тремя столбцами, а не только с двумя выбранными выше), а затем вы можете просто выбрать значение для таблицы1, чтобы получить тот же результат.

+0

Привет, я применил 'InnerJoin' в столбце' 2 Tables' 1, который является первичным ключом в 'First Table', является иностранным во второй таблице. Вторая таблица имеет 3 строки, связанные с внешним ключом, мне удалось выполнить rawquery, но я не знаю, как читать курсор, пусть говорят, что 1 строка из первой таблицы и 3 строки из второй таблицы в одном запросе. –