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 条目具有以下条件:
- 列表包括所有字段2 例如:1 (a,b,c),或
- 列表中包含所有字段 ex: 2 (a,c)
您可以将 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
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
另一种方法是使用 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
我有一个 table 这样的:
fields1 | field2 ---------------- 1_______| a_____ 1_______| b_____ 1_______| c_____ 2_______| a_____ 2_______| c_____
和字段 2 [a,b,c] 的列表。
我需要更好的 1 SQL 查询 select 所有 field1 条目具有以下条件:
- 列表包括所有字段2 例如:1 (a,b,c),或
- 列表中包含所有字段 ex: 2 (a,c)
您可以将 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
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
另一种方法是使用 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