Sql 按组返回查询
假设我有以下表格: 表1Sql 按组返回查询,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 有可能回来吗
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。