前段时间公司项目遇到一个比较棘手的问题,由于项目是多人合作完成且个别数据表会涉及到多人进行操作导致数据混乱,个别与其他表相关联的字段本该一个数值只出现一次,但由于多人合作,数据较混乱,又不知哪些有用那些没有,不能随便删数据,所以苦恼了好久,各种百度,最终终于查询到了解决办法,现记录如下:
在要删除的有重复数据中存在几种情况:
1.存在两条完全相同的纪录
这是最简单的一种情况,用关键字distinct就可以去掉。
example: select distinct * from table(表名) where (条件)
2.存在部分字段相同的纪录(有主键id即唯一键)
如果是这种情况的话用distinct是过滤不了的,这就要用到主键id的唯一性特点及group by分组
example:
select * from table where id in (select max(id) from table group by [去除重复的字段名列表,…])
3.没有唯一键ID
example:
select identity(int1,1) as id,* into newtable(临时表) from table
select * from newtable where id in (select max(id) from newtable group by [去除重复的字段名列表,…])
该项目为一个关于银行贷款的项目,借款人在用户端界面填写相关借款信息并提交,银行工作人员通过银行端界面查询到借款人相关信息,通过后台操作更改贷款人借款状态,借款人可在用户端查询每笔贷款的贷款状态等信息。我所遇到的问题就是借款状态所关联的借款表Loan(借款人所查看的借款信息列表)和借款状态表LoanProgress(查询每笔借款所处借款状态)的列表查询问题。下面将项目从简处理以备日后重温查看。
项目中所涉及到的列表:
Loan 借款表
Id | 借款人/企业id | 借款人类型 | 借款金额 | 创建人id | 创建时间 | 修改人id | 修改时间 |
---|---|---|---|---|---|---|---|
101 | 202 | 0 | 100 | 901 | 2019-01-03 | 807 | 2019-01-17 |
102 | 303 | 1 | 200 | 901 | 2019-01-09 | 803 | 2019-01-11 |
103 | 301 | 1 | 500 | 902 | 2019-01-13 | 801 | 2019-02-03 |
104 | 201 | 0 | 10 | 901 | 2019-01-10 | 809 | 2019-01-29 |
105 | 302 | 1 | 20 | 908 | 2019-01-20 | 801 | 2019-02-03 |
Borrower 借款人表
Id | 借款人名称 |
---|---|
201 | 柯西 |
202 | 泰勒 |
BorrowingEnterprise 借款企业表
Id | 借款企业名称 |
---|---|
301 | 兰尼斯特公司 |
302 | 史达克公司 |
303 | 克里斯安公司 |
LoanProgress 借款进度表
Id | 借款人/企业id | 借款人类型 | 借款表id | 借款进度 |
---|---|---|---|---|
401 | 302 | 1 | 105 | 审核中 |
402 | 201 | 0 | 104 | 审核完成 |
403 | 202 | 0 | 101 | 放款中 |
404 | 303 | 1 | 102 | 审核完成 |
405 | 201 | 0 | 104 | 放款中 |
406 | 301 | 1 | 103 | 审核中 |
407 | 202 | 0 | 101 | 审核完成 |
408 | 302 | 1 | 105 | 审核中 |
409 | 201 | 0 | 104 | 审核完成 |
410 | 303 | 1 | 102 | 审核完成 |
411 | 301 | 1 | 103 | 还款中 |
412 | 303 | 1 | 102 | 审核中 |
413 | 201 | 0 | 104 | 还款中 |
414 | 202 | 0 | 101 | 审核完成 |
415 | 301 | 1 | 103 | 审核完成 |
416 | 202 | 0 | 101 | 审核中 |
417 | 303 | 1 | 102 | 放款中 |
418 | 301 | 1 | 103 | 审核完成 |
执行SQL语句:
SELECT
t.id,
t.借款人/企业id
t.借款人类型
t.借款金额
t.创建人id,
t.创建时间,
t.修改人id,
t.修改时间,
,(
select 借款进度
from LoanProgress
where Id in (select max(Id) from LoanProgress where 借款表id is not null and 借款表id!='' and 借款表id=t.id group by 借款表id ) )借款进度
,(SELECT 借款人名称 FROM Borrower where id = t. 借款人/企业id) 借款人名称
,(SELECT 借款企业名称 FROM BorrowingNterprise where id = t.借款人/企业id) 借款企业名称
FROM Loan t
where t.创建人='901'
查询结果如下:
Id | 借款人/企业id | 借款人类型 | 借款金额 | 创建人id | 创建时间 | 修改人id | 修改时间 | 借款进度 | 借款人名称 | 借款企业名称 |
---|---|---|---|---|---|---|---|---|---|---|
101 | 202 | 0 | 100 | 901 | 2019-01-03 | 807 | 2019-01-17 | 审核中 | 泰勒 | |
102 | 303 | 1 | 200 | 901 | 2019-01-09 | 803 | 2019-01-11 | 放款中 | 克里斯安公司 | |
104 | 201 | 0 | 10 | 901 | 2019-01-10 | 809 | 2019-01-29 | 还款中 | 柯西 |
本文为原创文章,仅为个人拙见,如有任何问题或错误欢迎诸位大神多多指教!!