MS-ACCESS:删除除 top 1 之外的所有行并从查询中更新表
Posted
技术标签:
【中文标题】MS-ACCESS:删除除 top 1 之外的所有行并从查询中更新表【英文标题】:MS-ACCESS: Deleting all rows except for top 1 and updating a table from a query 【发布时间】:2009-05-22 13:16:11 【问题描述】:我几乎完成了这个,只是最后的几个小问题。我现在需要从表中删除所有记录,除了前 1 个记录,其中 readings_miu_id 是“DISTINCT”列。换句话说,我需要从表中删除除第一个 DISTINCT readings_miu_id 之外的所有记录。我假设我需要做的就是修改基本的删除语句:
DELETE FROM analyzedCopy2
WHERE readings_miu_id = some_value
但我不知道如何将 some_column=some_value 部分更改为:
where some_column notequal to (select top 1 from analyzedCopy2 as A
where analyzedCopy2.readings_miu_id = A.readings_miu_id)
然后我需要弄清楚如何使用 UPDATE 语句从查询中更新表 (analyzedCopy2)(这是我想要存储到表 analyzeCopy2 中的 RSSI 列中的所有值当前所在的位置)。我试过这个:
UPDATE analyzedCopy2 from testQuery3 SET analyzedCopy2.RSSI =
(select AvgOfRSSI from testQuery3 INNER JOIN analyzedCopy2 on analyzedCopy2.readings_miu_id = testQuery3.readings_miu_id where analyzedCopy2.readings_miu_id = testQuery3.readings_miu_id)
where analyzedCopy2.readings_miu_id = testQuery3.readings_miu_id
但显然我不能在更新语句中使用 FROM。有什么想法吗?
我确定我会以一种非常不标准的方式(如果不是完全错误的话,也可能是错误的),但我不允许使用 vb.net2008 来拉取和操作然后存储数据,就像我一样想所以我现在被困在 ms-access 中使用 sql 语句,这是一个很好的学习体验(即使尝试做我在 sql 语句中必须做的奇怪的事情也让我头疼我的甲板当然是比喻)
【问题讨论】:
【参考方案1】:MS Access UPDATE sql 语句不能引用查询,但它们可以引用表。所以要做的就是将查询结果存储到一个表中。
SELECT YourQuery.*
INTO TempTable1
FROM YourQuery
现在您可以在 UPDATE 查询中使用 TempTable1:
UPDATE TargetTable
INNER JOIN TempTable1 ON TempTable1.TargetTableId = TargetTable.Id
SET TargetTable.TargetField = TempTable1.SourceField
见my answer to this question。
【讨论】:
耶!!,谢谢。这适用于那部分现在我必须弄清楚如何从analyzedCopy2中删除不是第一个不同的readings_miu_id的所有行(记录),或者弄清楚如何修改这样的代码:SELECT top 1 * from analyzeCopy2 as A where readings_miu_id = A.readings_miu_id 得到我需要的东西。 如何定义第一个不同的读数_miu_id?有日期吗?【参考方案2】:我在这台机器上没有访问权限的副本,而且我已经有几年没有涉足访问权限了,所以我在这里疯狂地尝试一下,但是你能做一个
delete from analyzedCopy2
where readings_miu_id not in (select top 1 readings_miu_id from analyzedCopy2 order by...)
(您需要 order by 才能获得正确的前 1 条记录,也许是按 id 排序?)
如果没有访问权限的副本,我没有希望帮助您完成第二个。我知道我会如何在 TSQL 中做到这一点,但访问是一个完全不同的 wtf 水壶 :-)
【讨论】:
这有点接近,但它会删除所有 readings_miu_id 不等于整个表中顶部 readings_miu_id 的记录,而不是只删除重复的 readings_miu_id 行。我试过这个:从analyzedCopy2中删除为A where readings_miu_id not in(从analyzedCopy2中选择前1个readings_miu_id,其中analyzedCopy2.readings_miu_id = A.readings_miu_id order by readings_miu_id)但它不会删除任何内容。据我所知,这是因为我查看的是 top 1 readings_miu_id 的值(当我这样做时,它们都是)而不是 top 1 的整个记录 呃,我读到你原来的问题是想问这到底给了你什么——你想删除除 TOP 1 之外的所有内容,而这正是 Dan 的 SQL 给你的。也许您需要编辑您的问题。这在没有临时表的情况下应该是完全可行的。【参考方案3】:我试图使过于复杂,因为我需要提取的所有记录在每个字段中都有相同的信息,我需要做的就是使用:
SELECT DISTINCT readings_miu_id, DateRange, RSSI, ColRSSI, Firmware, CFGDate, FreqCorr, Active, OriginCol, ColID, Ownage, SiteID, PremID, prem_group1, prem_group2
FROM analyzedCopy2
ORDER BY readings_miu_id;
为了拉取每个 readings_miu_id 的前 1 条记录。
【讨论】:
以上是关于MS-ACCESS:删除除 top 1 之外的所有行并从查询中更新表的主要内容,如果未能解决你的问题,请参考以下文章