ID值至少一次不等于0时返回ID

时间:2019-06-03 12:19:21

标签: sql

我有2张桌子。

表_1

id | product
1  | a
2  | b
3  | c 
4  | d

table_2

product_id | value
1   | 0
2   | 0
1   | 5
2   | 0
4   | 10

如何从table_1返回有关ID的详细信息:

- are present in table_2 (table_1.id = table_2.product_id)
- do not have any associated value equal to 0 (for example id "1" should be excluded)

正确的结果应为id“ 4”,因为其值都不等于零。

我已经在下面的查询中尝试过,但它还会返回id在表_2中不存在的“ 3”。

SELECT * FROM table_1
WHERE id NOT IN (
SELECT product_id FROM table_2
WHERE value = 0)

4 个答案:

答案 0 :(得分:1)

您可以使用两个条件:

SELECT t1.*
FROM table_1 t1 
WHERE EXISTS (SELECT 1
              FROM table_2 t2
              WHERE t1.id = t2.product_id
             ) AND
      NOT EXISTS (SELECT 1
              FROM table_2 t2
              WHERE t1.id = t2.product_id AND t2.value = 0
             );

答案 1 :(得分:1)

天真的方法:

-- Step 1: Select product IDs to ignore
SELECT product_id
FROM table_2
WHERE value = 0

-- Step 2: Select product IDs to include
SELECT product_id
FROM table_2
WHERE product_id NOT IN ( -- Use the result of Step 1
    SELECT product_id
    FROM table_2
    WHERE value = 0
)

-- Final query: Select products
SELECT *
FROM table_1
WHERE product_id IN ( -- Use the result of Step 2
    SELECT product_id
    FROM table_2
    WHERE product_id NOT IN ( -- Use the result of Step 1
        SELECT product_id
        FROM table_2
        WHERE value = 0
    )
)

答案 2 :(得分:0)

使用聚合的一个选项:

SELECT
    t1.id,
    t1.product
FROM table_1 t1
INNER JOIN table_2 t2
    ON t1.id = t2.product_id
GROUP BY
    t1.id,
    t1.product
HAVING
    COUNT(CASE WHEN t2.value = 0 THEN 1 END) = 0;

为了使HAVING子句返回true,乘积必须在第二个表中没有任何零值。另外,内部联接会过滤掉第二个表中根本不出现的所有产品。

答案 3 :(得分:0)

通过按product_id分组并将条件放在HAVING子句中,可以获得用于IN子句的id。

SELECT * FROM table_1
WHERE id IN (
  SELECT product_id 
  FROM table_2
  GROUP BY product_id
  HAVING SUM(CASE WHEN value = 0 THEN 1 ELSE 0 END) = 0
)