Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按组返回查询_Sql - Fatal编程技术网

Sql 按组返回查询

Sql 按组返回查询,sql,Sql,假设我有以下表格: 表1 Name Food ______________ Sam Chips Tom Chips Larry Chips 表2 Name Type _____________ Sam Dip Tom Dip Larry Dip Marry Soda Peter Soda Sam Soda Larry Soda Sam Beer Larry Beer 有可能回来吗

假设我有以下表格:

表1

Name     Food 
______________
Sam      Chips
Tom      Chips
Larry    Chips
表2

Name     Type
_____________
Sam      Dip
Tom      Dip
Larry    Dip
Marry    Soda
Peter    Soda
Sam      Soda
Larry    Soda
Sam      Beer
Larry    Beer
有可能回来吗

Name    Type
____________
Sam     Dip
Tom     Dip
Larry   Dip
使用表1中的名称作为一个组,并使该组在表2中完全匹配

苏打水的类型不匹配,因为它有玛丽,彼得,山姆,拉里。
啤酒类型只有萨姆和拉里。

我想这就是你想要的

SELECT t1.Name, MIN(t2.Type)
FROM [Table 1] t1 JOIN [Table 2] t2 ON t1.Name = t2.Name
GROUP BY t1.Name

我想这就是你想要的

SELECT t1.Name, MIN(t2.Type)
FROM [Table 1] t1 JOIN [Table 2] t2 ON t1.Name = t2.Name
GROUP BY t1.Name

如果我正确理解您的问题,您可以使用子查询,子查询将如下所示

 select * 
 from table2 
 where name in (select name 
                from table 1 
                group by name);

如果我正确理解您的问题,您可以使用子查询,子查询将如下所示

 select * 
 from table2 
 where name in (select name 
                from table 1 
                group by name);

使用完全外部联接,然后检查是否没有引入任何其他联接。以下查询获取匹配的“类型”:

select t2.type
from table1 t1 full outer join
     table2 t2
     on t1.name = t2.name
group by t2.type
having count(*) = count(t1.name) and -- all t1.names match
       count(*) = count(t2.name)     -- all t2.names match
       count(*) = (select count(*) from table1) -- all are present
这假定没有重复的名称。如有必要,明智地使用
distinct
可以解决该问题


一旦您有了类型,您就可以返回到表2以获取所有行。

使用完全外部联接,然后检查是否没有引入任何其他内容。以下查询获取匹配的“类型”:

select t2.type
from table1 t1 full outer join
     table2 t2
     on t1.name = t2.name
group by t2.type
having count(*) = count(t1.name) and -- all t1.names match
       count(*) = count(t2.name)     -- all t2.names match
       count(*) = (select count(*) from table1) -- all are present
这假定没有重复的名称。如有必要,明智地使用
distinct
可以解决该问题


一旦有了类型,就可以返回到表2以获取所有行。

您可以通过询问表2中的条目总数与常用名称的数量相同并且表1中没有其他条目(名称)的类型来找到这些行

在SQL中:

SELECT Table2.Name, Table2.Type
FROM
(
  SELECT Type
  FROM (SELECT DISTINCT Type FROM Table2) AS types
  WHERE (
    SELECT COUNT(*)
    FROM Table2 i2
    JOIN Table1 i1 ON i1.Name = i2.Name
    WHERE i2.Type = types.Type
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  )
  AND (
    SELECT COUNT(*)
    FROM Table1
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type
在行动中看到它:

在MySQL中,您可以使用该函数生成一个更短、更易于阅读的查询:

SELECT Table2.Name, Table2.Type
FROM
(
  SELECT Type
  FROM (SELECT DISTINCT Type FROM Table2) AS types
  WHERE (
    SELECT GROUP_CONCAT(Name ORDER BY Name)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  ) = (
    SELECT GROUP_CONCAT(Name ORDER BY Name)
    FROM Table1
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type
意识到

演示:

还不完全清楚您是否真的想要匹配整个表1,但上述解决方案可以很容易地扩展到每种食物和类型的匹配组合:

SELECT result.Food, Table2.Name, result.Type
FROM
(
  SELECT Type, Food
  FROM (SELECT DISTINCT Type, Food FROM Table2 JOIN Table1) AS combinations
  WHERE (
    SELECT COUNT(*)
    FROM Table2 i2
    JOIN Table1 i1 ON i1.Name = i2.Name
    WHERE i2.Type = combinations.Type
    AND i1.Food = combinations.Food
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = combinations.Type
  )
  AND (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = combinations.Type
  ) = (
    SELECT COUNT(*)
    FROM Table1 i1
    WHERE i1.Food = combinations.Food
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type

演示:

您可以通过询问表2中条目总数与常用名称数量相同且表1中没有其他条目(名称)的类型来找到这些条目

在SQL中:

SELECT Table2.Name, Table2.Type
FROM
(
  SELECT Type
  FROM (SELECT DISTINCT Type FROM Table2) AS types
  WHERE (
    SELECT COUNT(*)
    FROM Table2 i2
    JOIN Table1 i1 ON i1.Name = i2.Name
    WHERE i2.Type = types.Type
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  )
  AND (
    SELECT COUNT(*)
    FROM Table1
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type
在行动中看到它:

在MySQL中,您可以使用该函数生成一个更短、更易于阅读的查询:

SELECT Table2.Name, Table2.Type
FROM
(
  SELECT Type
  FROM (SELECT DISTINCT Type FROM Table2) AS types
  WHERE (
    SELECT GROUP_CONCAT(Name ORDER BY Name)
    FROM Table2 i2
    WHERE i2.Type = types.Type
  ) = (
    SELECT GROUP_CONCAT(Name ORDER BY Name)
    FROM Table1
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type
意识到

演示:

还不完全清楚您是否真的想要匹配整个表1,但上述解决方案可以很容易地扩展到每种食物和类型的匹配组合:

SELECT result.Food, Table2.Name, result.Type
FROM
(
  SELECT Type, Food
  FROM (SELECT DISTINCT Type, Food FROM Table2 JOIN Table1) AS combinations
  WHERE (
    SELECT COUNT(*)
    FROM Table2 i2
    JOIN Table1 i1 ON i1.Name = i2.Name
    WHERE i2.Type = combinations.Type
    AND i1.Food = combinations.Food
  ) = (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = combinations.Type
  )
  AND (
    SELECT COUNT(*)
    FROM Table2 i2
    WHERE i2.Type = combinations.Type
  ) = (
    SELECT COUNT(*)
    FROM Table1 i1
    WHERE i1.Food = combinations.Food
  )
) AS result
JOIN Table2 ON result.Type = Table2.Type


演示:

这更像是一个内部连接解决方案,你不是说“潜伏者”而不是“巨魔”吗?在将来,请包括您的RDBMS,尽管对于这个查询,通用版本应该是可能的。AdnreKR做了我需要的,至少我知道这是可以做到的,只是需要更多的努力。这看起来更像是一个内部连接解决方案。你不是说“潜伏者”而不是“巨魔”吗?在将来,请包括您的RDBMS,尽管对于这个查询,通用版本应该是可能的。AdnreKR做了我需要的,至少我知道可以做到,只是需要做更多我没有注意到,但是有多个Larry's和Sam's,因为他们有不同的类型,所以我认为分组是唯一的方法。@Nick我也不明白你的意思。分组会带来我不需要的其他类型,但是谢谢你的回复。我没有注意到,但是有多个Larry's和Sam's,因为他们有不同的类型,所以我认为分组是唯一的方法。@Nick我也不明白你的意思。分组会带来我不需要的其他类型,但是谢谢你的回复。他正在寻找匹配的组,所以这(本身)他不会做他需要的事情-基本上,他需要找出
Dip
组与
芯片组完全匹配的事实。哦,我明白了。这个表的设计对我来说似乎很糟糕,但在注意到这一点并编写查询方面做得很好。他正在寻找匹配的组,所以这(本身)并不能满足他的需要-基本上,他需要找出
Dip
组与
芯片
组完全匹配的事实。哦,我明白了。这种表设计对我来说似乎很糟糕,但注意到这一点并编写查询还是很好的。谢谢AndreKR,这样做就是使用SQL选项访问。第一个例子是正确的,我需要做一些Tweek来让它在Access中工作。谢谢你的回复,至少我知道它可以是sql中的dont。谢谢AndreKR,这样做就是使用sql选项访问。第一个例子是正确的,我需要做一些Tweek来让它在Access中工作。谢谢你的回复,至少我知道它可以用sql。