我的数据库中有人在PERSON表中,每个人都应该在PERSON_CRITERIA表中分配至少两个标准(CRITERIA表存储实际标准)。我想显示分配给它们的标准少于两个的所有记录(根本不包括任何标准)。我试过这个,但它不起作用,因为我希望:
SELECT PERSON.Last_Name, PERSON.First_Name FROM PERSON_CRITERIA
INNER JOIN PERSON
ON PERSON_CRITERIA.Person_ID=PERSON.Person_ID
HAVING COUNT (* ) < 2
这没有“HAVING”线。它为PERSON_CRITERIA中分配给它们的每个条件实例返回一个PERSON记录。我想只显示少于两个分配给他们的那些,包括没有。包含HAVING语句后,它将返回以下错误:
Column 'PERSON.Last_Name' is invalid in the select list because
it is not contained in either an aggregate function or the GROUP BY clause.
我认为这不会起作用,因为JOIN语句可能会删除所有没有条件的记录。帮助....
答案 0 :(得分:4)
在聚合中,SELECT原因中的列必须位于GROUP BY或聚合(此处为COUNT)
SELECT PERSON.Last_Name, PERSON.First_Name FROM PERSON_CRITERIA
INNER JOIN PERSON
ON PERSON_CRITERIA.Person_ID=PERSON.Person_ID
GROUP BY PERSON.Last_Name, PERSON.First_Name -- missing this
HAVING COUNT (* ) < 2
查找PERSON_CRITERIA中 no 行的位置(编辑以修复表格顺序)
SELECT
PERSON.Last_Name, PERSON.First_Name
FROM
PERSON
LEFT JOIN
PERSON_CRITERIA ON PERSON_CRITERIA.Person_ID=PERSON.Person_ID
GROUP BY
PERSON.Last_Name, PERSON.First_Name
HAVING
COUNT (PERSON_CRITERIA.Person_ID) < 2
答案 1 :(得分:4)
INNER JOIN
表示在联接的两边都必须有记录。
您需要使用LEFT OUTER JOIN
。 (,您还需要使用GROUP BY
才能将HAVING
与聚合一起使用
SELECT
PERSON.Last_Name,
PERSON.First_Name
FROM
PERSON
LEFT OUTER JOIN PERSON_CRITERIA ON PERSON_CRITERIA.Person_ID=PERSON.Person_ID
GROUP BY
PERSON.Person_ID,
PERSON.Last_Name,
PERSON.First_Name
HAVING COUNT (PERSON_CRITERIA.Person_ID) < 2