【发布时间】:2021-01-08 14:35:03
【问题描述】:
我是 SQL 新手,通常通过 Google 和 SO 解决问题,但我无法完全理解所需的 SQL。
我的问题类似于Delete sql rows where IDs do not have a match from another table,但在我的情况下,我有一个必须查询的中间表,所以这是场景:
我们有这个 INSTANCES 表,它基本上列出了发送到数据库的所有文件,但必须与 CROSS_REF 连接,以便我们的报告应用程序知道要查询哪个表以获取报告,而我们只是有孤立的 INSTANCES 行我想整理。每个 DETAIL 表都包含与其他表不同的字段。
如果在任何 DETAIL 表中没有该 Instance ID 的记录,我想从 INSTANCES 中删除所有单个记录。 DETAIL 表定期清理旧文件,但 Instance 记录没有清理,因此我们有很多没有任何关联 DETAIL 数据的 INSTANCE 记录。问题是,我必须从 CROSS_REF 中选择 Table Name 才能知道要查找 Instance ID 的 DETAIL_X 表。
那么在下面的示例中,由于 DETAIL_1 没有 Instance ID = 1001 的记录,我想从 INSTANCES 中删除 1001 记录。
实例
| Instance ID | Detail ID |
|---|---|
| 1000 | 123 |
| 1001 | 123 |
| 1002 | 234 |
CROSS_REF
| Detail ID | Table Name |
|---|---|
| 123 | DETAIL_1 |
| 124 | DETAIL_2 |
| 125 | DETAIL_3 |
DETAIL_1
| Instance ID |
|---|
| 1000 |
| 1000 |
| 2999 |
【问题讨论】:
-
你需要使用动态sql来完成这样的任务。所以我建议在谷歌上搜索这个术语,并找到一些关于如何构建动态查询的示例,其中参与查询的表名事先不知道。
-
3张固定表不需要动态SQL。
DETAIL你有几张桌子 -
@Charlieface 大约 200 张桌子。一个实例将只有一个详细表中的记录,但在详细记录已被删除的情况下,我想删除实例记录,因为这些是用户选择的,我不想显示选项没有详细数据。
-
就我个人而言,我会先将所有表合并为一个。您的设置完全违反了范式规则
标签: sql sql-server