在数据库中存在一张表t1表示联系人,其中包含两个字段姓名(name),电话(tel),但由于某些原因导致数据重复,如下所示: Name Tel 张三 60121 张三 60121 张三 60121 李四 60125 李四 60125 王二 60126 王二 60126 写一个sql语句,删除重复记录,只保留有效记录。 提示: 可以通过oracle的rowid列实现
时间: 2023-12-03 20:43:04 浏览: 115
可以使用如下的 SQL 语句来删除重复记录,只保留有效记录:
```sql
delete from t1
where rowid not in (
select max(rowid)
from t1
group by name, tel
);
```
这个 SQL 语句会先通过子查询找到每个姓名和电话的组合的最后一条记录的 rowid,然后在主查询中删除除这些记录以外的所有记录。这样就能够删除重复记录,只保留有效记录。
相关问题
pl/sql语句在数据库中存在一张表t1表示联系人,其中包含两个字段姓名(name),电话(tel),但由于某些原因导致数据重复,如下所示: Name Tel 张三 60121 张三 60121 张三 60121 李四 60125 李四 60125 王二 60126 王二 60126 写一个sql语句,删除重复记录,只保留有效记录。 提示: 可以通过oracle的rowid列实现
可以使用以下PL/SQL语句来删除重复记录,只保留有效记录:
```
DELETE FROM t1
WHERE rowid NOT IN (
SELECT MIN(rowid)
FROM t1
GROUP BY name, tel
);
```
这条语句将根据姓名和电话号码分组,并保留每个组中的第一条记录,同时删除其他重复记录。由于我们使用了ROWID,因此可以确保在删除记录时不会误删任何有效记录。
注意:在实际使用中,应该先备份原始数据,以防误删或数据错误。
clickhouse数据库中的一张表有很多个字段,其中两个字段,一个字段是公司名称,一个字段是产品类型编号,这张表有很多条数据,现在根据公司名称和产品类型编号分组统计出数量作为 num 字段,一个公司有一个产品类型编号的数量,另一个公司没有该产品类型编号的数量,也要统计出来,num赋值为0,该如何写sql呢
可以使用`LEFT JOIN`和`COALESCE`函数来实现:
```sql
SELECT t1.company_name,
t2.product_type_id,
COALESCE(COUNT(*), 0) AS num
FROM table_name t1
CROSS JOIN (SELECT DISTINCT product_type_id FROM table_name) t2
LEFT JOIN table_name t3
ON t1.company_name = t3.company_name AND t2.product_type_id = t3.product_type_id
GROUP BY t1.company_name, t2.product_type_id
ORDER BY t1.company_name, t2.product_type_id;
```
首先使用`CROSS JOIN`和子查询获取所有不同的产品类型编号,然后使用`LEFT JOIN`将表中的数据与这些不同的产品类型编号进行连接,如果某个公司没有该产品类型编号,则连接结果中对应的数据为`NULL`,然后使用`COALESCE`函数将`NULL`值转换为0。最后按照公司名称和产品类型编号进行分组统计,并按照公司名称和产品类型编号排序。
阅读全文