读书人

【100分】金山面试题,该怎么解决

发布时间: 2012-09-25 09:55:59 作者: rapoo

【100分】金山面试题
题目如下:
数据库1中存放着a类数据,数据库2中存放着以天为单位划分的表30张(比如table_20110909,table_20110910,table_20110911),总共是一个月的数据。表1中的a类数据中有一个字段userid来唯一判别用户身份,表2中的30张表(每张表结构相同)也有一个字段userid来唯一识别用户身份。如何判定a类数据库的多少用户在数据库2中出现过?

1)各位高手能否说一下这道题的考点是什么
2)能否说一下你们的实现思路或者关键的sql语句

[解决办法]
select count(*) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110911 where userid = 数据库1.a类数据.userid)
[解决办法]
数据量很大的话用临时表处理就可以了。
[解决办法]

探讨

引用:
select count(*) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.u……

[解决办法]
1)各位高手能否说一下这道题的考点是什么

题目没有说明 2个数据库是否在同一机器上,如不在,要用到
FEDERATED 存储引擎

对大数据量的操作

2)能否说一下你们的实现思路或者关键的sql语句
可以用merge 存储引擎为实现
OR
EXISTS、UNION来实现

[解决办法]
小菜鸟也插句嘴,如果数据量很少 1类的嵌套可以,
如果数据量较大,那就用临时表吧
create temprary table tem_id(id int)
insert into tem_id select id from 库2.table1
insert ignore into tem_id select id from 库2.table2
......
insert into tem_id select id from 库2.table12
select count(*) from 库1.table a inner join tem_id b on a.id=b.id
呵呵 我还没接触跨DB 操作 假想都是在一耳光服务器上
[解决办法]
都是高手呀,咋就我一菜呢
[解决办法]
也许按userid进行join union到临时表会更好点?
[解决办法]
我不知道.
[解决办法]
用hash表。大数据处理一般把需要的数据一下子找出来放到内存,在内存中处理,如果用表连接得处理到何年何月,反正现在的内存都白菜价了
[解决办法]
探讨

引用:

引用:
select count(*) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110910 where user……

[解决办法]
这个问题我们也遇到过,我们的解决方法是:建立一张用户表,UserInMonth(userid)表里面只放不重复的用户Id,把(table_20110909,table_20110910,table_20110911)的用户Id放到一张User表里面userid都统一放到这个表里面去。判断的时候select count(1) from user u inner join UserInMonth um on u.userid=um.userid.至于数据可以用存储过程,或者一些数据仓库的用具。
另外说一点,把表拆分的每日一张表,就是因为数据量比较大。。。我以前做一个GPS项目的时候,也是这么做的,每天一张表,一张表5G左右的数据。我们是把原始数据和计算过的业务数据分离的思路来实现的。。。希望对你有帮助。
[解决办法]
如果数据量非常大的话,还硬要在数据库处理,就有点缘木求鱼的感觉了。
放入hadoop处理。哈哈。
[解决办法]
探讨
引用:
引用:

引用:

引用:
select count(*) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2……

[解决办法]
也来吐槽一个不成熟的建议,可以把数据库2中表的userid存到物化视图里,然后两个数据库做连接查询
------解决方案--------------------


探讨

这个问题我们也遇到过,我们的解决方法是:建立一张用户表,UserInMonth(userid)表里面只放不重复的用户Id,把(table_20110909,table_20110910,table_20110911)的用户Id放到一张User表里面userid都统一放到这个表里面去。判断的时候select count(1) from user u inner join UserInMonth u……

[解决办法]
都很有才, 一代人才么么
[解决办法]
还是怎么办都逃不过30张表的查询:
1.建立id表用来存放30张表的userid
create table id(userid varchar2(20)) 不用设主键
2.插入数据可以不去重复
insert in to id (select userid from table_20110909) 就插吧 30个挨个插
现在id表已经具备30天所有userid了
现在有两种选择
3.1把表id数据导出再导入到数据库1就可以查了
select distinct userid from a where userid in(select userid from id)
或者3.2 数据库1与数据库2建立连接 用@实现查询
select distinct userid from a where userid in(select userid from id@数据库2)

有能逃过30张表查询的请赐教


[解决办法]
补充一点如果常用的话 insert in to id (select userid from table_20110901)可以写一个PL/SQL
用LOOP循环或者for循环实现
[解决办法]
还是我 弱弱的说一句上边高手们都想着用SQL 没有想到用PL/SQL 我是写VC加oracle数据库的所以提醒一句oracle也是有编程的
[解决办法]
数据库的大牛!DBA很吃香啊?
[解决办法]
新来的,研究下!
[解决办法]
数据库1和数据库2什么意思? 是同一个数据库里的两个模式(oracle),两个SQLServer里的Database, 还是两个不同字符串连接的数据库?

这个问题都没说清楚,看来金山出题这哥们就一个初级水平啊。
[解决办法]
是是文件啊啊
[解决办法]
主要考程序的效率。思路如下:
1.对数据数2中每张表进行Userid去重统计
2.得出整个数据库的USERID的去重统计
3。统计出USERID与表1比较一下即可
关键不能拿表1与表2比,否则效率极差
[解决办法]
这个还是仔细想想,肯定有高手回帮你的
[解决办法]
又补充了
[解决办法]
建一张中间表访问记录表
[解决办法]
建一张中间表访问记录表
[解决办法]
都是高手啊!
[解决办法]
我觉得可以每个表按照userId建索引,然后先把每个表的 userId 选出来,然后再用join来全部连接。得出的结果就是所有表都存在的userId集合。
select userId from 数据库1.a类数据
inner join (select userId from 数据库2.table_20110909) on 数据库1.a类数据.userId = 数据库2.table_20110909.userId
inner join (select userId from 数据库2.table_20110910) on 数据库1.a类数据.userId = 数据库2.table_20110910.userId
inner join (select userId from 数据库2.table_20110910) on 数据库1.a类数据.userId = 数据库2.table_20110911.userId
......

使用一个后台小程序在服务器上跑,每天定时取出数据存到文本文件里面就行。
[解决办法]
数据量大,查询次数较多或者对查询响应时间有要求的话,添加临时表。
[解决办法]
帮你写完吧:
DECLARE @LogTimeFrom DATETIME,@LogTimeTo DATETIME

SELECT id into #tmp from db1.a

SELECT 'dbo2.table_' + CONVERT(VARCHAR(8),DATEADD(mm,number,@LogTimeFrom),112) AS LogTable INTO #Table FROM master..spt_values WHERE TYPE='p' and number<=DATEDIFF(mm,@LogTimeFrom,@LogTimeTo)

DECLARE @t TABLE (id int,count bigint )

DECLARE MyCursor CURSOR
FOR SELECT LogTable FROM #Table
OPEN MyCursor
DECLARE @LogTable nvarchar(200)


FETCH NEXT FROM MyCursor INTO @LogTable
WHILE @@FETCH_STATUS =0
BEGIN
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''' + @LogTable + ''') AND type in (N''U''))
BEGIN
INSERT INTO @t
SELECT id,count(1) as count
FROM ' + @LogTable + ' l
INNER JOIN
#tmp t ON l.ID = t.ID
gruop by t.id
end
FETCH NEXT FROM MyCursor INTO @LogTable
END
CLOSE MyCursor
DEALLOCATE MyCursor
DROP TABLE #LogTable

SELECT * FROM @t

DROP TABLE #tmp,#Table

读书人网 >Mysql

热点推荐