SQL получает строки, соответствующие ВСЕМ условиям - PullRequest
0 голосов
/ 07 ноября 2011

Я хотел бы получить все строки, соответствующие набору условий в одном столбце.Но я хотел бы строки только если ВСЕ условия хороши, и нет строки, если только одно условие не выполняется.Например, взяв эту таблицу:

|id|name|
---------
|1 |toto|
|2 |tata|

Я хотел бы иметь возможность запросить, есть ли в этой таблице "tata" && "toto".Но когда я спрашиваю, есть ли "tata" и "tuto", я хотел бы получить пустой ответ, если один из аргументов отсутствует в таблице, например, спрашивая, включены ли "toto" && "tutu" в таблицу.Как я могу это сделать ?В настоящее время я делаю один запрос на аргумент, что не очень эффективно.Я испробовал несколько решений, включая подвыбор или группу +, но никто не работает так, как я хочу.

спасибо за вашу поддержку!ура

Ответы [ 4 ]

1 голос
/ 07 ноября 2011

Это не самый эффективный способ, но этот запрос будет работать.

SELECT * FROM table_name 
WHERE (name = 'toto' OR name = 'tata') 
AND ( SELECT COUNT(*) FROM table_name WHERE name = 'toto') > 0 
AND ( SELECT COUNT(*) FROM table_name WHERE name = 'tata') > 0
1 голос
/ 07 ноября 2011

Это немного расплывчато. Если имена уникальны, вы можете сосчитать соответствующие строки, которые соответствуют предложению where:

where name='toto' or name='tata'

Если количество равно 2, то вы знаете, что оба совпадают. Если имя не уникально, вы могли бы потенциально выбрать первый идентификатор (выберите top 1 id ...), который соответствует каждому в объединении, и сосчитать их с внешним выбором.

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

0 голосов
/ 07 ноября 2011

Если name уникален, вы можете упростить до:

SELECT *
FROM   tbl
WHERE  name IN ('toto', 'tata')
AND    (SELECT count(*) FROM tbl WHERE name IN ('toto', 'tata')) > 1;

Если это не так:

SELECT *
FROM   tbl
WHERE  name IN ('toto', 'tata')
AND    EXISTS (SELECT * FROM tbl WHERE name = 'toto')
AND    EXISTS (SELECT * FROM tbl WHERE name = 'tata');

Или, в PostgreSQL, MySQL и, возможно, других:

SELECT *
FROM   tbl
WHERE  name IN ('toto', 'tata')
AND    (SELECT count(DISTINCT name) FROM tbl WHERE name IN ('toto', 'tata')) > 1;
0 голосов
/ 07 ноября 2011
SELECT 1 AS found FROM hehe
WHERE 1 IN (SELECT 1 FROM hehe WHERE name='tata')
  AND 1 IN (SELECT 1 FROM hehe WHERE name='toto')
...