在所有表上查询 IsDeleted = 0
Query IsDeleted = 0 on all tables
在我的数据库中,我有 9 个表,我需要创建一个视图。
这个视图最终会查询所有的表。这里的一个一致性是所有表中都有一列用于 IsDeleted。我如何 运行 查询来检查所有表中 IsDeleted = 0 的列?
三个表分别是:Customers、County、Country
这是我的观点:
CREATE VIEW vwTEST
AS
SELECT
Cus.CustomerId,
Cus.FirstName,
Cus.LastName,
Cty.CountyName,
Cry.CountryName
FROM
Customers Cus
LEFT JOIN
County Cty
ON
Cus.CountyId = Cty.CountyId
WHERE
Cus.IsDeleted = 0
LEFT JOIN
Country Cry
ON
Cus.CountryId = Cry.CountryId
WHERE
Cry.IsDeleted = 0
Table formats
这取决于你想要的结果。如果您还想拥有那些未被删除但删除了县或国家/地区的客户,那么您必须仅对未删除的记录进行子查询 select 并加入:
CREATE VIEW vwTEST
AS
SELECT
Cus.CustomerId,
Cus.FirstName,
Cus.LastName,
Cty.CountyName,
Cry.CountryName
FROM
Customers Cus
LEFT JOIN
(SELECT
County.CountyId,
County.CountyName
FROM County
WHERE County.IsDeleted = 0) AS Cty ON Cus.CountyId = Cty.CountyId
LEFT JOIN
(SELECT
Country.CountryId,
Country.CountryName
FROM Country
WHERE Country.IsDeleted = 0) AS Cry ON Cus.CountryId = Cry.CountryId
WHERE Cus.IsDeleted = 0;
结果(此处包含所有字段)将是:
如果您只想要未删除任何内容的行,那么它只是:
SELECT
*
FROM Customers Cus
LEFT JOIN County Cty ON Cus.CountyId = Cty.CountyId
LEFT JOIN Country Cry ON Cus.CountryId = Cry.CountryId
WHERE Cus.IsDeleted = 0 AND Cty.IsDeleted = 0 AND Cry.IsDeleted = 0;
结果将是:
我的测试数据集,作为没有任何 WHERE 条件的 JOIN 的结果:
SELECT
*
FROM Customers Cus
LEFT JOIN County Cty ON Cus.CountyId = Cty.CountyId
LEFT JOIN Country Cry ON Cus.CountryId = Cry.CountryId;
是:
此致
问题是,当您在外部(即 LEFT
)加入一个 table 但在 WHERE
子句中对那个 table 有条件时,您有效地转向加入 inner 加入。这是因为在 after 之后执行了 where 子句条件,然后创建了 ion,但是错过的连接的列全部为空值,因此任何比较都将失败。
解决方案是将外部连接 table 上的 all 条件移动到连接的 ON
子句中,该子句执行 as加入.
CREATE VIEW vwTEST AS
SELECT
Cus.CustomerId,
Cus.FirstName,
Cus.LastName,
Cty.CountyName,
Cry.CountryName
FROM Customers Cus
LEFT JOIN County Cty
ON Cus.CountyId = Cty.CountyId
AND Cus.IsDeleted = 0
LEFT JOIN Country Cry
ON Cus.CountryId = Cry.CountryId
AND Cry.IsDeleted = 0
当只有删除的行可用时,此查询仍然允许县和国家不加入。
看来你本能地知道这一点,但不知道表达它的语法,因为我所要做的就是将 WHERE
更改为 AND
。
在我的数据库中,我有 9 个表,我需要创建一个视图。
这个视图最终会查询所有的表。这里的一个一致性是所有表中都有一列用于 IsDeleted。我如何 运行 查询来检查所有表中 IsDeleted = 0 的列?
三个表分别是:Customers、County、Country
这是我的观点:
CREATE VIEW vwTEST
AS
SELECT
Cus.CustomerId,
Cus.FirstName,
Cus.LastName,
Cty.CountyName,
Cry.CountryName
FROM
Customers Cus
LEFT JOIN
County Cty
ON
Cus.CountyId = Cty.CountyId
WHERE
Cus.IsDeleted = 0
LEFT JOIN
Country Cry
ON
Cus.CountryId = Cry.CountryId
WHERE
Cry.IsDeleted = 0
Table formats
这取决于你想要的结果。如果您还想拥有那些未被删除但删除了县或国家/地区的客户,那么您必须仅对未删除的记录进行子查询 select 并加入:
CREATE VIEW vwTEST
AS
SELECT
Cus.CustomerId,
Cus.FirstName,
Cus.LastName,
Cty.CountyName,
Cry.CountryName
FROM
Customers Cus
LEFT JOIN
(SELECT
County.CountyId,
County.CountyName
FROM County
WHERE County.IsDeleted = 0) AS Cty ON Cus.CountyId = Cty.CountyId
LEFT JOIN
(SELECT
Country.CountryId,
Country.CountryName
FROM Country
WHERE Country.IsDeleted = 0) AS Cry ON Cus.CountryId = Cry.CountryId
WHERE Cus.IsDeleted = 0;
结果(此处包含所有字段)将是:
如果您只想要未删除任何内容的行,那么它只是:
SELECT
*
FROM Customers Cus
LEFT JOIN County Cty ON Cus.CountyId = Cty.CountyId
LEFT JOIN Country Cry ON Cus.CountryId = Cry.CountryId
WHERE Cus.IsDeleted = 0 AND Cty.IsDeleted = 0 AND Cry.IsDeleted = 0;
结果将是:
我的测试数据集,作为没有任何 WHERE 条件的 JOIN 的结果:
SELECT
*
FROM Customers Cus
LEFT JOIN County Cty ON Cus.CountyId = Cty.CountyId
LEFT JOIN Country Cry ON Cus.CountryId = Cry.CountryId;
是:
此致
问题是,当您在外部(即 LEFT
)加入一个 table 但在 WHERE
子句中对那个 table 有条件时,您有效地转向加入 inner 加入。这是因为在 after 之后执行了 where 子句条件,然后创建了 ion,但是错过的连接的列全部为空值,因此任何比较都将失败。
解决方案是将外部连接 table 上的 all 条件移动到连接的 ON
子句中,该子句执行 as加入.
CREATE VIEW vwTEST AS
SELECT
Cus.CustomerId,
Cus.FirstName,
Cus.LastName,
Cty.CountyName,
Cry.CountryName
FROM Customers Cus
LEFT JOIN County Cty
ON Cus.CountyId = Cty.CountyId
AND Cus.IsDeleted = 0
LEFT JOIN Country Cry
ON Cus.CountryId = Cry.CountryId
AND Cry.IsDeleted = 0
当只有删除的行可用时,此查询仍然允许县和国家不加入。
看来你本能地知道这一点,但不知道表达它的语法,因为我所要做的就是将 WHERE
更改为 AND
。