Как узнать, что строка не существует?

У меня такой запрос:

SELECT rowid FROM table1 ORDER BY RANDOM() LIMIT 1

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

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

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

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

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

person Ilya Suzdalnitski    schedule 26.04.2009    source источник


Ответы (2)


SELECT rowid FROM table1
WHERE rowid IN ( SELECT DISTINCT table1_id FROM table3 )
ORDER BY RANDOM() LIMIT 1;

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

Каждая строка в table1 имеет равную вероятность быть выбранной (DISTINCT), если на нее есть хотя бы раз ссылка в table3.

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

person Stephen Jennings    schedule 26.04.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;
person bignose    schedule 27.04.2009