涉及多个表的查询:INNER JOIN排除了一些行

时间:2015-10-05 10:39:21

标签: sql ms-access ms-access-2010 ms-access-2013

我有一个包含12列的大表,其中4列包含以下字段:VersionID,StatusID,Owner ID等。

我有3个用于版本,状态等的小表...此表包含以下信息:“VersionID”1 = Active“; VersionID 2 = Disabled ... etc”同样适用于StatusID和OwnerID。 我创建了一个查询,显示来自,,, Big Table的信息“,并且应该从较小的表中显示VersionID,StatusID等中包含的信息,例如:如果在大表中,显示的VersionID是”1“我想让它显示定义..在这种情况下“活跃”。

我设法使用以下代码执行此操作:

SELECT 
    Object.Type, Object.ID, Object.Key, Object.IsInactive, 
    Version.Version AS VersionID, 
    Status.StatusText AS StatusID, 
    ObjectDetail.BalancePosition, ObjectDetail.FrequencyID, 
    ObjectDetail.FrequencyTimeLagID, ObjectDetail.ObjectName, 
    ObjectDetail.Description, ObjectDetail.ValueSpecification, 
    ObjectDetail.Computation, ObjectDetail.StorageSystemID, 
    ObjectDetail.StorageSystemField, ObjectDetail.TableFunctionalDatamodel, 
    ObjectDetail.OwnerID
FROM 
    Version 
    INNER JOIN 
    (
        [Object] 
        INNER JOIN 
        (
            ObjectDetail 
            LEFT JOIN 
            Status 
                ON ObjectDetail.[StatusID] = Status.[ID]
        ) 
            ON Object.ID = ObjectDetail.ObjectID
    ) 
        ON Version.ID = ObjectDetail.VersionID
WHERE (((Object.Type)=0) AND ((Object.ID) Is Null)) 
    OR (((Object.Type)=0) AND ((Object.Key) Is Null)) 
    OR (((Object.Type)=0) AND ((Object.IsInactive) Is Null)) 
    OR (((Object.Type)=0) AND ((Version.Version) Is Null) AND ((ObjectDetail.VersionID) Is Null)) 
    OR (((Object.Type)=0) AND ((Status.StatusText) Is Null)) 
    OR (((ObjectDetail.BalancePosition) Is Null)) 
    OR (((ObjectDetail.FrequencyID) Is Null)) 
    OR (((ObjectDetail.FrequencyTimeLagID) Is Null));

这很好用,问题是错误的条目,比如我们“999”,例如在StatusID - “999”中没有小表中的定义..没有显示。我希望查询只显示没有条目的字段或在小表中没有定义的条目。

1 个答案:

答案 0 :(得分:3)

所以你基本上不想找到列中包含无效值的行?

您可以使用left join并仅包含null结果来实现此目的:

SELECT a.x, b.y FROM BigTable a
LEFT JOIN SmallTable1 b ON b.id = a.id
WHERE b.id IS NULL