Как вернуть массив внешних строк в SQLITE? - PullRequest
0 голосов
/ 29 апреля 2020

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

В любом случае, это мои таблицы ...

CREATE TABLE table_a (identifier PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE table_b (identifier PRIMARY KEY, name TEXT UNIQUE, fk_a INTEGER, FOREIGN KEY(fk_a) REFERENCES table_a(identifier);

table_a:

1 | ABC
2 | DEF
3 | GHI

table_b:

1 | abc | 1
2 | def | 1
3 | ghi | 2

... и теперь я ищу оператор, который возвращает строку в table_a со всеми соответствующими строками из table_b в массиве:

1 | ABC | [1 | abc | 1, 2 | def | 1]

Возможно ли это вообще? Если это ... какой самый краткий способ написать это?

Заранее спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Я думаю, что вы хотите group_concat():

select a.identifier, a.name,
  '[' || group_concat(b.identifier ||  ' | ' ||  b.name ||  ' | ' || b.fk_a) || ']' col
from table_a a left join table_b b
on b.fk_a = a.identifier
group by a.identifier, a.name;

См. Демоверсию . Результаты:

| identifier | name | col                       |
| ---------- | ---- | ------------------------- |
| 1          | ABC  | [1 | abc | 1,2 | def | 1] |
| 2          | DEF  | [3 | ghi | 2]             |
| 3          | GHI  |                           |

или, если вы предпочитаете, с json_group_array():

select a.identifier, a.name,
  json_group_array(b.identifier ||  ' | ' ||  b.name ||  ' | ' || b.fk_a) col
from table_a a left join table_b b
on b.fk_a = a.identifier
group by a.identifier, a.name;

См. Демонстрационную версию . Результаты:

| identifier | name | col                           |
| ---------- | ---- | ----------------------------- |
| 1          | ABC  | ["1 | abc | 1","2 | def | 1"] |
| 2          | DEF  | ["3 | ghi | 2"]               |
| 3          | GHI  | [null]                        |

Вы можете использовать:

replace(json_group_array(b.identifier ||  ' | ' ||  b.name ||  ' | ' || b.fk_a), '"', '')

, если вам не нужны двойные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...