在所有表上查询 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