SQL-筛选结果以匹配两个不同行中的两列

SQL-筛选结果以匹配两个不同行中的两列,sql,select,Sql,Select,我正在做一个SQL测试,如下所示: 编写一条SQL语句,检索与史密斯在同一项目上工作的所有人员,每个项目的工作时间相同。对于示例数据,只应检索Smith和Brown。Oaks被取消资格,因为Oaks只在项目Y上工作了10个小时(而不是像smith那样工作了20个小时) 下表: | name | project | hours | |-------|---------|-------| | Smith | X | 10 | | Smith | Y | 20 |

我正在做一个SQL测试,如下所示: 编写一条SQL语句,检索与史密斯在同一项目上工作的所有人员,每个项目的工作时间相同。对于示例数据,只应检索Smith和Brown。Oaks被取消资格,因为Oaks只在项目Y上工作了10个小时(而不是像smith那样工作了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')