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

Posted

技术标签:

【中文标题】涉及多个表的查询:INNER JOIN 排除了一些行【英文标题】:Query involving multiple tables: INNER JOIN excludes some rows 【发布时间】:2015-10-05 10:39:21 【问题描述】:

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

我有 3 个用于 Version、Status 等的小表...该表包含以下信息:“VersionID “1 = Active”;VersionID 2 = Disabled...etc” StatusID 和 OwnerID 也是如此。 我创建了一个查询,它显示来自“大表”的信息,并且应该从较小的表中显示 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】:

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

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

【讨论】:

嗨,是的,这是正确的.. 我试过这个:SELECT VersionID.ObjectDetail, ID.Version FROM ObjectDetail INNER JOIN Version ON Version.ID = VersionID.ID WHERE VersionID.id NOT IN (SELECT id FROM Version); 但不知何故我得到了一个错误.. @GordThompson,是的,我刚刚看到,将其删除,谢谢 :) 这有帮助,我终于明白了:) 谢谢。

以上是关于涉及多个表的查询:INNER JOIN 排除了一些行的主要内容,如果未能解决你的问题,请参考以下文章

SQL----Inner Join Outer JoinCross Join理解

来自同一个表的多个 INNER JOIN

表的基本查询语句及使用连表(inner joinleft join)子查询

多个INNER JOIN子查询sql

如何在一个查询中INNER JOIN 2或3个具有相同表的不同数据库

数据库多表查询之 where & INNER JOIN