sql 关系除以选择具有列表中所有值的列的所有条目

sql relational divide selecting all entries with a column that have all values in a list

我有一个 table 这样的:

fields1 | field2
----------------
1_______| a_____
1_______| b_____
1_______| c_____
2_______| a_____
2_______| c_____

和字段 2 [a,b,c] 的列表。

我需要更好的 1 SQL 查询 select 所有 field1 条目具有以下条件:

您可以将 HAVING 子句与 CASE WHEN 一起使用:

the list include all fields2 ex: 1 (a,b,c)

SQL Server:

SELECT LEFT(fields1,1) AS result
FROM #tab
GROUP BY LEFT(fields1,1)
HAVING SUM(CASE WHEN field2 LIKE 'a%' THEN 1 END) > 0
   AND SUM(CASE WHEN field2 LIKE 'b%' THEN 1 END) > 0
   AND SUM(CASE WHEN field2 LIKE 'c%' THEN 1 END) > 0
   AND SUM(CASE WHEN field2 LIKE '[^abc]%' THEN 1 ELSE 0 END) = 0; 
   -- add last condition only if 'a....|b....|c....` are allowed

LiveDemo

all fields2 are included in the list ex: 2 (a,c)

SELECT LEFT(fields1,1) AS result
FROM #tab
GROUP BY LEFT(fields1,1)
HAVING SUM(CASE WHEN field2 LIKE 'a%' THEN 1 END) > 0
   AND SUM(CASE WHEN field2 LIKE 'c%' THEN 1 END) > 0
   AND SUM(CASE WHEN field2 LIKE '[^ac]%' THEN 1 ELSE 0 END) = 0;
   -- add last condition only if 'a...|c...' are allowed

LiveDemo2

另一种方法是使用 COUNT DISTINCT:

SELECT LEFT(fields1,1) AS result
FROM #tab
WHERE LEFT(field2, 1) IN ('a','b','c')
GROUP BY LEFT(fields1,1)
HAVING COUNT(DISTINCT LEFT(field2, 1)) = 3
   AND COUNT(CASE WHEN LEFT(field2, 1) NOT IN ('a','b','c') THEN 1 END) = 0
   -- add last condition only if 'a....|b....|c....` are allowed

LiveDemo3