SQL-筛选结果以匹配两个不同行中的两列
我正在做一个SQL测试,如下所示: 编写一条SQL语句,检索与史密斯在同一项目上工作的所有人员,每个项目的工作时间相同。对于示例数据,只应检索Smith和Brown。Oaks被取消资格,因为Oaks只在项目Y上工作了10个小时(而不是像smith那样工作了20个小时) 下表:SQL-筛选结果以匹配两个不同行中的两列,sql,select,Sql,Select,我正在做一个SQL测试,如下所示: 编写一条SQL语句,检索与史密斯在同一项目上工作的所有人员,每个项目的工作时间相同。对于示例数据,只应检索Smith和Brown。Oaks被取消资格,因为Oaks只在项目Y上工作了10个小时(而不是像smith那样工作了20个小时) 下表: | name | project | hours | |-------|---------|-------| | Smith | X | 10 | | Smith | Y | 20 |
| name | project | hours |
|-------|---------|-------|
| Smith | X | 10 |
| Smith | Y | 20 |
| Doe | Y | 20 |
| Brown | X | 10 |
| Doe | Z | 30 |
| Chang | X | 10 |
| Brown | Y | 20 |
| Brown | A | 10 |
| Woody | X | 10 |
| Woody | Y | 10 |
我想到了这个:
SELECT * INTO #temp
FROM workson
WHERE name='smith'
SELECT * from workson as w
WHERE project IN
(SELECT project FROM #temp
WHERE project=w.project AND hours=w.hours )
DROP TABLE #temp
结果:
name project hours
Smith X 10
Smith Y 20
Doe Y 20
Brown X 10
Chang X 10
Brown Y 20
Woody X 10
但问题是,只有史密斯和布朗会回来。我不知道如何以任何优雅的方式过滤掉其他人
谢谢。此解决方案是公认答案的替代方案。它使用两个
内部联接
操作来实现最终结果。SELECT
子查询标识与“Smith”具有相同项目/小时集的名称
SELECT t2.name, t1.project, t1.hours
FROM workson t1
INNER JOIN workson t2
ON t1.project = t2.project AND t1.hours = t2.hours
INNER JOIN
(
SELECT w2.name
FROM workson w1
INNER JOIN workson w2
ON w1.project = w2.project AND w1.hours = w2.hours
WHERE w1.name = 'Smith'
GROUP BY w2.name
HAVING COUNT(*) = (SELECT COUNT(*) FROM workson WHERE name = 'Smith')
) t3
ON t2.name = t3.name
WHERE t1.name = 'Smith'
请按照以下链接进行运行演示:
我对上述答案有一些问题,但它为我提供了一个非常好的框架,因此我不能真正相信这个答案:
SELECT name, project, hours FROM workson w2
WHERE name IN
(SELECT name FROM workson w
INNER JOIN
(SELECT project, hours FROM workson
WHERE name = 'Smith') q1
ON q1.project = w.project AND q1.hours = w.hours
GROUP BY w.name
HAVING COUNT (*) = (SELECT COUNT(*) FROM workson WHERE name = 'Smith'))
AND project IN (SELECT project FROM workson WHERE name = 'Smith')
谢谢你,丹尼尔,斯蒂金和蒂姆。一切都很好。现在是时候研究它们为什么工作了:)
SELECT name, project, hours FROM workson w2
WHERE name IN
(SELECT name FROM workson w
INNER JOIN
(SELECT project, hours FROM workson
WHERE name = 'Smith') q1
ON q1.project = w.project AND q1.hours = w.hours
GROUP BY w.name
HAVING COUNT (*) = (SELECT COUNT(*) FROM workson WHERE name = 'Smith'))
AND project IN (SELECT project FROM workson WHERE name = 'Smith')