Как узнать, что строки не существует? - PullRequest
1 голос
/ 26 апреля 2009

У меня следующий запрос:

SELECT rowid FROM table1 ORDER BY RANDOM() LIMIT 1

И у меня есть еще одна таблица (таблица3). В этой таблице у меня есть столбцы table1_id и table2_id. table1_id - это ссылка на строку в table1, а table2_id - это ссылка на строку в другой таблице.

Я хочу в своем запросе получить только те результаты, которые определены в таблице 3. Только те, у которых table1 rowid в столбце table1_id. Может не быть никаких столбцов, относящихся к определенному rowid таблицы1, поэтому в этом случае я не хочу их получать.

Как мне достичь этой цели?

Обновление: я пробовал следующий запрос, который не работает:

SELECT rowid FROM table1
WHERE rowid IN (SELECT table1_id FROM table3 WHERE table1_id = table1.rowid)
ORDER BY RANDOM() LIMIT 1

Ответы [ 2 ]

1 голос
/ 27 апреля 2009

Если вы хотите выбрать более просто rowid, вам нужно ВЫБРАТЬ из JOIN между интересующими вас таблицами. SQLite не У вас нет полного набора стандартных функций JOIN, поэтому вам нужно заново обработать ваш запрос, чтобы он мог использовать LEFT OUTER JOIN .

SELECT table1.rowid, table1.other_field
FROM table3
    LEFT OUTER JOIN table1 ON table3.table1_id = table1.rowid
ORDER BY RANDOM()
LIMIT 1;
1 голос
/ 27 апреля 2009
SELECT rowid FROM table1
WHERE rowid IN ( SELECT DISTINCT table1_id FROM table3 )
ORDER BY RANDOM() LIMIT 1;

Этот запрос означает «выбрать случайным образом строку из table1, в которой есть запись в table3».

Каждая строка в таблице1 равна вероятности выбора (DISTINCT), если на нее ссылаются хотя бы один раз в table3.

Если вы пытаетесь получить более одного результата, вам следует удалить предложение "ORDER BY RANDOM() LIMIT 1".

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