3

我有这种表:

a   b

8   7
8   2
9   7
9   2
9   3

我想获得一个“a”值,使其具有“b”的精确搜索值。例如,如果我搜索 (7,2),我希望查询返回 8,如果我搜索 (7,2,3),我希望它返回 9,否则它必须返回 Null:

Search      Result
(7,2)       8
(7,2,3)     9
(7,3)       Null
(7,2,4)     Null
...

是否可以在不使用“group by”连接的情况下做到这一点?

[编辑] 对于“按连接分组”,我的意思是 MySql 中的 GROUP_CONCAT() 或任何字符串函数。

4

4 回答 4

0

不确定“按连接分组”是什么意思-我认为没有:group by

您没有指定您的 DBMS,所以这是 ANSI SQL:

with search_values (val) as (
   values (7), (2)
)
-- first part gets all those that do have the search values
-- but will also include those rows that have more than the searched ones
select a
from data
where b in (select val from search_values)
group by a
having count(distinct b) = (select count(*) from search_values)

intersect
-- the intersect then filters out those that have exactly the search values

select a
from data
group by a
having count(distinct b) = (select count(*) from search_values);

SQLFiddle 示例:http ://sqlfiddle.com/#!15/dae93/1

对“搜索值”使用 CTE 可以避免重复它们,并避免“硬编码”要搜索的项目数。如果您寻找 7、2、3,您只需向 CTE 添加另一个值

intersect可以用一个相关的子查询重写而不是使用它

with search_values (val) as (
   values (7), (2)
)
select d1.a
from data d1
where d1.b in (select val from search_values)
group by d1.a
having count(distinct d1.b) = (select count(*) from search_values)
   and count(distinct d1.b) = (select count(*) from data d2 where d2.a = d1.a);
于 2014-03-27T11:29:53.153 回答
0

另一种方法是使用INTERSECT

然而,第一种情况似乎是一个仍然需要破解的坚果(返回 8,9 而不是 8)。

这是SQL代码:

--(7,2) => 8,9 (instead of 8) :(
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 7
   INTERSECT
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 2

--(7,2,3) => 9
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 7
   INTERSECT
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 2
   INTERSECT
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 3

--(7,4) => NULL
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 7
   INTERSECT
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 4

--(7,2,4) => NULL
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 7
   INTERSECT
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 2
   INTERSECT
   SELECT  distinct(a)
    FROM   t1
    WHERE  b = 4

小提琴演示

于 2014-03-27T11:47:22.873 回答
0

/ group byconcatenation 方法有效。另一种方法是group by使用having子句:

select a
from table t
group by a
having sum(case when b = 7 then 1 else 0 end) = 1 and
       sum(case when b = 2 then 1 else 0 end) = 1 and
       sum(case when b not in (7, 2) then 1 else 0 end) = 0;

这个想法是计算每个值中匹配的值。您实际上可以使用字符串操作来执行此操作,但这些操作因数据库而异。in这是使用您正在寻找的值的数量执行此操作的“一般”方式:

select a
from table t
group by a
having count(*) = 2 and
       count(distinct (case when b in (2, 7) then b end));
于 2014-03-27T11:09:15.550 回答
0

在 SQL Server 中

SELECT a FROM tableName
WHERE a NOT IN ( SELECT a FROM (   
                               SELECT a,
                               CASE WHEN CHARINDEX(b,@searchTerm)=0 
                               THEN 0 ELSE 1 END as Result
                               FROM tableName
                               )z
                  WHERE z.Result=0
               )

我正在使用 CHARINDEX() 函数来检查搜索词是否存在。

于 2014-03-27T11:10:06.733 回答