帮助我需要快速查询。
这是我的情况:
我有2张桌子,员工和期间。
假设表雇员包含emp_no,emp_name 表格句点包含period_code,emp_no。
看起来很好,直到用户输入30k数据并全部搜索。
我的第一个想法是这样的
SELECT p.* from periods p
INNER JOIN employees e ON p.emp_no = e.emp_no
WHERE p.period_code = 'p01' and (e.emp_no IN (first 5k emp_no) or e.emp_no IN (another 5k emp_no), etc).
但是从那个查询中它不会返回那个不在那个时期的员工。 假设只有10k员工在那个时期,另外10k是真实数据但是那些员工不在p01而另一个10k是非存在数据但用户输入并搜索它。
我有另一个想法但不太确定。 我创建临时表,它将插入用户搜索的所有emp_no。 然后我加入他们,这样就可以告诉哪个员工在期间和员工中存在,哪个员工不在那个时期,哪个员工没有效。
某些人喜欢SELECT t.emp_no,ee.emp_name,p.pcode from employee e
JOIN period p ON p.emp_no = e.emp_no
RIGHT JOIN temp_t t ON t.emp_no = p.emp_no
LEFT JOIN employee ee ON ee.emp_no = t.emp_no
结果是好的,因为在pcode字段中只有emp01不为空
你们有没有更好的方法而不将数据插入临时表?
ps:我不知道为什么sqlfiddle不起作用,这里有一些用于测试
CREATE TABLE employee
(`emp_no` VARCHAR(7), `emp_name` varchar(7))
;
CREATE TABLE period
(`pcode` VARCHAR(7), `emp_name` varchar(7))
;
CREATE TABLE temp_t
(`emp_no` VARCHAR(7))
;
INSERT INTO employee
(`emp_no`, `emp_name`)
VALUES
('emp01', 'name1'),
('emp02', 'name2')
;
INSERT INTO period
(`pcode`, `emp_no`)
VALUES
('p01', 'emp01')
;
INSERT INTO temp_t
(`emp_no`)
VALUES
('emp01'),
('emp02'),
('emp03')
;
答案 0 :(得分:0)
首先,每张桌子应该有PRIMARY KEY
。 可能 employee
应该有PRIMARY KEY(emp_no)
而period
应该有PRIMARY KEY(pcode)
。
之后,请用语言描述您想要实现的目标。