我有3个逻辑表:患者,遭遇和位置。
我当前的加载脚本:
encounter:
SQL
SELECT PAT_ID, DEPT_ID, ENC_ID, ENC_DATE
FROM encounter e
WHERE enc_date >= '10/1/2014' AND enc_date < '10/14/2014'
;
patient:
SQL
SELECT PAT_ID, PAT_NAME, BIRTH_DATE, GENDER
FROM patient p
;
location:
SQL
SELECT DEPT_ID, DEPT_NAME, LOC_ID, LOC_NAME
FROM department d
INNER JOIN location l on d.loc_id=l.loc_id
;
我只想加载与遭遇实际相关的患者和部门数据。在编写时,脚本会加载所有患者和部门数据。
答案 0 :(得分:0)
有两种方法可以解释您的问题:下载整个表但限制实际加载到QlikView中的内容,或者在加载到QlikView之前限制从数据库请求的数据量(即不是每个都下载整个表时间)。
在第一种情况下,有两种方法,您可以将表连接在一起或限制加载到每个表中。
<强>加入强>
如果您不介意所有数据都在一个表中,您只需在SQL语句之间添加QlikView JOIN
语句,如下所示:
encounter:
SQL
SELECT PAT_ID, DEPT_ID, ENC_ID, ENC_DATE
FROM encounter e
WHERE enc_date >= '10/1/2014' AND enc_date < '10/14/2014'
;
LEFT JOIN (encounter)
patient:
SQL
SELECT PAT_ID, PAT_NAME, BIRTH_DATE, GENDER
FROM patient p
;
LEFT JOIN (encounter)
location:
SQL
SELECT DEPT_ID, DEPT_NAME, LOC_ID, LOC_NAME
FROM department d
INNER JOIN location l on d.loc_id=l.loc_id
;
然后,这会移除patient
和location
中与之无关的所有值。
限制加载到每个表格
此方法稍微复杂一些,但会使表保持独立,但会减少其中的数据量。但是,它仍然从数据源查询整个表。您可以使用QlikView exists
函数检查已加载PAT_ID
和DEPT_ID
的数据,并相应地限制其他表格,如下所示:
encounter:
SQL
SELECT PAT_ID, DEPT_ID, ENC_ID, ENC_DATE
FROM encounter e
WHERE enc_date >= '10/1/2014' AND enc_date < '10/14/2014'
;
patient_dis:
LOAD DISTINCT
PAT_ID as PAT_ID_DIS
RESIDENT encounter;
dept_dis:
LOAD DISTINCT
DEPT_ID as DEPT_ID_DIS
RESIDENT encounter;
patient:
LOAD
*
WHERE exists(PAT_ID_DIS,PAT_ID);
SQL
SELECT PAT_ID, PAT_NAME, BIRTH_DATE, GENDER
FROM patient p
;
location:
LOAD
*
WHERE exists(DEPT_ID_DIS, DEPT_ID);
SQL
SELECT DEPT_ID, DEPT_NAME, LOC_ID, LOC_NAME
FROM department d
INNER JOIN location l on d.loc_id=l.loc_id
;
DROP TABLES patient_dis, dept_dis;