2014-01-08 1 views
0

Я пытаюсь найти все наборы двух записей в моей «истории», чтобы две записи не соединялись ни с одной из одних и тех же записей определенного типа в «символ» (через «участник», объект моста). Вот запрос, как я написал:SQLite: использование других таблиц для исключения результатов из самосоединения

SELECT str1._id, str2._id 
FROM story AS str1, story AS str2 
WHERE str1._id < str2._id 
AND (SELECT COUNT(chr_id) FROM 
    (SELECT chr_id 
    FROM participant 
    WHERE isparent = 0 
    AND str_id = str1._id 
    INTERSECT 
    SELECT chr_id 
    FROM participant 
    WHERE isparent = 0 
    AND str_id = str2._id)) = 0; 

Внутренний запрос и подсчет запросов вокруг него, функция, как ожидается, при использовании на своих собственных с str1._id и str2._id заменены фактическими значениями, но весь запрос все вместе, кажется, дает TRUE для окончательного условия в тех случаях, когда он не должен. Это заставляет меня подозревать, что проблема связана с псевдонимом, но я не уверен, что изменить, чтобы исправить это.

EDIT: Вот выборочные данные в таблице участников, которые я использую, чтобы проверить

str_id chr_id isparent 
    1  1   1 
    1  2   1 
    1  3   0 
    2  1   1 
    2  3   0 
    3  4   1 
    3  3   1 
    3  5   0 
    3  6   0 
    3  7   0 

Вот результат запроса дает

_id _id 
    1 2 
    1 3 
    2 3 

А вот выход я ожидал

_id _id 
    1 3 
    2 3 
+0

Вы не указали таблицу 'story', но с таблицей, содержащей' 1', '2',' 3', этот запрос работает для меня. –

ответ

0

Я немного упростил запрос, и теперь он делает то, что он предназначен. Вот новый запрос:

SELECT str1._id, str2._id 
FROM story AS str1, story AS str2 
WHERE str1._id < str2._id 
AND (SELECT chr_id 
    FROM participant 
    WHERE isparent = 0 
    AND str_id = str1._id 
    INTERSECT 
    SELECT chr_id 
    FROM participant 
    WHERE isparent = 0 
    AND str_id = str2._id) IS NULL; 

Однако загадка заключается в том, почему исходный запрос не работал.