您的规范化数据集很差,有时会发生这种情况,但出于性能原因值得修改。
要获得您正在查找的查询,您需要派生一组所有不同的语言,为最高工资提取一个标识符,然后用该工资引用程序员。有很多方法可以实现这一点,最简单的方法可能是用三个子查询。
SELECT
lang.prof,
(
SELECT TOP 1 pname
FROM programmer
WHERE prof1 = lang.prof OR prof2 = lang.prof
ORDER BY salary DESC
) as Name,
(
SELECT MAX(Salary)
FROM programmer
WHERE prof1 = lang.prof OR prof2 = lang.prof
) as MaxSalary
FROM (
SELECT prof1 as prof FROM programmer
UNION
SELECT prof2 as prof FROM programmer
) AS lang
注意,这个查询不优化,远离最有效的方式来查询您的表。如果可能的话,重新构建您的数据,让程序员,语言和他们的熟练程度在不同的表格上。
一个干净的实现,带有嵌套的子查询。更多查询,但是您通过直接引用查询Programmer
,并且可以添加任意任意行。
SELECT
Lang.prof,
P.PName,
P.Salary
FROM
(
SELECT LL.prof, MAX(sP.salary) as MaxSalary
(
SELECT prof1 as prof FROM programmer
UNION
SELECT prof2 as prof FROM programmer
) as LL
INNER JOIN programer sP
ON LL.prof = sP.prof1 OR LL.prof = sP.prof2
GROUP BY LL.prof
) as Lang
INNER JOIN programmer P
ON (Lang.prof = P.prof1 OR P.prof2)
AND lang.MaxSalary = P.salary
你至少能证明你试过了什么吗?即使它不工作,这样我们会更加兴奋,帮助你:) – Bryan
可能的重复[帮助为要求编写查询的方式](http://stackoverflow.com/questions/2726369/帮助这种方式来编写查询的要求) –