Esta es la contestación más correcta que te podemos compartir, sin embargo mírala detenidamente y analiza si se puede adaptar a tu trabajo.
Solución:
Dada su pregunta actualizada, estas son las formas más simples:
Si ProductID
es único lo que quieres
SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100)
y luego verifique ese resultado contra 3
la cantidad de productos que está consultando (esta última parte se puede hacer en SQL, pero puede ser más fácil hacerlo en C# a menos que esté haciendo aún más en SQL).
Si ProductID
no es único es
SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100)
Cuando se pensaba que la pregunta requería devolver filas cuando todas ProductIds
están presentes y ninguno en otro caso:
SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(*) FROM Products WHERE ProductID IN (1, 10, 100))=3)
o
SELECT ProductId FROM Products WHERE ProductID IN (1, 10, 100) AND ((SELECT COUNT(DISTINCT ProductID) FROM Products WHERE ProductID IN (1, 10, 100))=3)
si realmente tiene la intención de hacer algo con los resultados. De lo contrario, el simple SELECT 1 WHERE (SELECT ...)=3
hará lo que otras respuestas han declarado o implicado.
Así es como lo hago normalmente:
Sólo reemplazar su consulta con esta declaración SELECT * FROM table WHERE 1
SELECT
CASE WHEN EXISTS
(
SELECT * FROM table WHERE 1
)
THEN 'TRUE'
ELSE 'FALSE'
END
@Mark Hurd, gracias por señalar el error.
esto funcionará (si está utilizando Postgresql, Sql Server 2008):
create table products
(
product_id int not null
);
insert into products values(1),(2),(10),(100);
SELECT
CASE
WHEN EXISTS(
SELECT 1
FROM (values(1),(10),(100)) as x(id)
WHERE x.id NOT IN (select product_id from products))
THEN 0 --'NOT ALL'
ELSE 1 -- 'ALL'
END
Si está utilizando MySQL, cree una tabla de memoria temporal (luego complete 1,10,100 allí):
create table product_memory(product_id int) engine=MEMORY;
insert into product_memory values(1),(10),(100);
SELECT
CASE
WHEN EXISTS(
SELECT 1
FROM product_memory
WHERE product_memory.id NOT IN (select product_id from products))
THEN 0 -- 'NOT ALL'
ELSE 1 -- 'ALL'
END
En su código C#:
bool isAllExist = (int)(new SqlCommand(queryHere).ExecuteScalar()) == 1;
[EDIT]
¿Cómo puedo escribir una consulta que devolverá una fila si existen todas las identificaciones de productos y ninguna fila si no existen una o más identificaciones de productos?
Con respecto a devolver una fila (singular) si existen todas las filas, y sin fila para ser devuelto si uno o más id de producto no existe:
MySql:
SELECT 1
WHERE
NOT EXISTS(
SELECT 1
FROM product_memory
WHERE product_memory.id NOT IN (select product_id from products) )
Posgresql, Servidor Sql 2008:
SELECT 1
WHERE
NOT EXISTS(
SELECT 1
FROM (values(1),(10),(100)) as x(id)
WHERE x.id NOT IN (select product_id from products) )
Luego en tu código C#:
var da = new SqlDataAdapter(queryhere, connectionhere);
var dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
return true;
else
return false;
O simplemente acortar la condición:
return dt.Rows.Count > 0;