多表查询: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
我有 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