如何在单独的表中识别没有链接的记录?

时间:2011-12-12 17:03:13

标签: sql sql-server-2008

我的数据库中有人在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语句可能会删除所有没有条件的记录。帮助....

2 个答案:

答案 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