【问题标题】:common sql where in inner join内部连接中的常见sql
【发布时间】:2021-07-13 21:37:48
【问题描述】:

我对 SQL 数据库世界很陌生。我有一个要求,我必须将对该表行所做的每个更改(即更新、删除)存储为版本。我可以获取最新版本(即带有isLatestisDeleted 标志的最新更改。现在,我需要加入至少 3 个表(如果它很吓人,它可能会超时增加到 20 个表)。所以应该将加入应用于最新的文档,即isLatest=true,它没有被删除,即isDeleted=false。有没有办法在查询结束时使用通用sql,因为所有表都有isLatestIsDeleted行。 这是我的表格结构和预期输出。

用户表:

| id | name   | version | isLatest | isDeleted |
| 1  | John   | 0       | false    | false     |
| 1  | john   | 1       | false    | false     |
| 1  | Johnny | 2       | true     | false     |
| 2  | Sarah  | 2       | true     | false     |
| 2  | sarah  | 1       | false    | false     |
| 2  | Sarah  | 0       | false    | false     |
| 3  | Jane   | 1       | true     | true      |
| 3  | Jane   | 0       | false    | true      |

就业表:

| user_id | employment_id | type      | isLatest | isDeleted |   |
| 1       | emp1          | Intern    | false    | false     |   |
| 1       | emp1          | Part Time | false    | false     |   |
| 1       | emp1          | Full Time | true     | false     |   |
| 2       | emp2          | Full Time | false    | false     |   |
| 2       | emp2          | Part Time | true     | false     |   |
| 3       | emp3          | Part Time | true     | true      |   |

预期输出:

| user_id | name  | employment_id | type      | isLatest | isDeleted |
| 1       | Johnny| emp1          | Full Time | true     | false     |
| 2       | Sarah | emp2          | Part Time | true     | false     |

我想使用的查询:

select employment.user_id, user.id, employment.employment_id, 
        employment.type, user.isLatest, user.isDeleted 
from employment 
    inner join user ON user.id = employment.user_id 
where isLatest = true and isDeleted = false

【问题讨论】:

  • 与您的问题无关,而只是一般性的 FYI - 这种方法存在一些问题(假设您没有遗漏任何信息)。一 - 它不遵循 3NF(已删除和最新版本是 id 唯一的数据),二 - 没有主键 - 您可以从 (user_id, version) 派生主键,但这可能会更令人头疼。三 - 无论您采用哪种方法,请确保您的索引与您的查询一致,否则忘记 20 个表,3 会让人头疼:)
  • 是的。我使用 id 和 version 作为复合主键

标签: javascript mysql sql node.js


【解决方案1】:

您基本上会使用 join 并过滤您想要的行:

select . . .    -- whatever columns you want
from users u join
     employment e
     on u.user_id = e.user_id
where u.isLatest and e.isLatest and
      not u.isDeleted and not e.isDeleted;

注意:如果标志是数字,则无需比较即可使用它们。

【讨论】:

  • 感谢您的快速回复。我想动态生成查询。而不是在每一行上写u.isLateste.isLatest,我只想在查询结束时使用它(因为我提到我将加入超过3个表)。在每一行上都使用它可能不是有效的。我们可以为整个查询命名别名并在最后使用别名过滤吗?
  • @ajay 。 . .我不明白。这在某种意义上“在最后”过滤——在join 之后的where 子句中。也许您真正想要的是视图只返回未删除的最新行。
猜你喜欢
  • 2017-03-28
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2016-08-17
相关资源
最近更新 更多