多表查询:INNER JOIN 排除部分行

Query involving multiple tables: INNER JOIN excludes some rows

我有 1 个大 table,有 12 列,其中 4 列有字段,例如:VersionID、StatusID、Owner ID 等。

我有 3 个小 tables 用于版本、状态等...此 table 包含诸如以下的信息:"VersionID "1 = Active";VersionID 2 = Disabled。 ..etc” StatusID 和 OwnerID 也是如此。 我创建了一个查询,它显示来自 ,Big Table" 的信息,VersionID、StatusID 等中包含的信息应该从较小的 tables 显示,例如:如果在大 table 显示的 VersionID 是“1” 我希望它显示定义..在这种情况下 "Active".

我使用以下代码设法做到了这一点:

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));

这工作得很好,问题是错误的条目,例如 StatusID 中的“999”——“999”在小table中没有定义..没有显示。我希望查询仅显示没有条目的字段或在小 table.

中没有定义的条目

所以您基本上不想在其列中查找具有无效值的行?

您可以使用 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