Снять гнездо оператора SQL - PullRequest
0 голосов
/ 14 июля 2009

У меня есть этот рабочий оператор SQL:

select oriseqs.newID from oriseqs WHERE oriseqs.singlets=1 AND 
oriseqs.newID not in (select newID from cleanreport WHERE trash!="")

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

Вот соответствующая схема, если необходимо:

CREATE TABLE cleanreport(newID TEXT, perc TEXT, inicoord INTEGER, endcoord INTEGER, ilen INTEGER, trash TEXT, comments TEXT);
CREATE TABLE oriseqs(newID TEXT, oldID TEXT, rawseq TEXT, singlets BOOLEAN);

Ответы [ 3 ]

3 голосов
/ 14 июля 2009
SELECT oriseqs.newID 
FROM oriseqs AS o
LEFT JOIN cleanreport AS cr ON o.newID = cr.newID
WHERE oriseqs.singlets=1 
AND trash != ""
AND cr.newID IS NULL

Что такое ПК?

1 голос
/ 14 июля 2009

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

0 голосов
/ 14 июля 2009
select o.newID 
from            oriseqs     o
left outer join cleanreport c on c.newID = o.newID
WHERE o.singlets=1 
AND c.newID is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...