1

我这个学期正在学习 DBMS 课程,我想确保我取得了良好的进步并练习了良好的思维,我自己处理查询的方法有点像分而治之 - 我将查询拆分为子查询并使其成为视图,然后一般来说,使用这些视图来简单地收集我需要的信息,这是一个好方法吗?

有什么替代方法?

你自己的方法是什么?如果您认为它比我的更好,为什么?

例子 :

给定:数据库:http ://sqlfiddle.com/#!2/cdd98/1

(Q7) 查找访问过与其保险公司相关的所有骨科医师(专科)的患者。

.

CREATE VIEW Orthos AS
SELECT  d.cid,d.did
FROM Doctors d
WHERE d.speciality='Orthopedist';

CREATE VIEW OrthosPerInc AS
SELECT  o.cid, COUNT(o.did) as countd4i
FROM Orthos o
GROUP BY o.cid;

CREATE VIEW OrthoVisitsPerPat AS
SELECT v.pid,COUNT(o.did) as countv4d
FROM Orthos o,Visits v,Doctors d
WHERE o.did=v.did and d.did=o.did
GROUP BY v.pid,d.cid;

SELECT  p.pname,p.pid,p.cid
FROM  OrthoVisitsPerPat v, OrthosPerInc i,Patient p
WHERE i.countd4i = v.countv4d and p.pid=v.pid and p.cid=i.cid
4

2 回答 2

1

这真的取决于数据库。一些数据库(例如 MySQL)在优化使用视图的查询方面很糟糕。其他人并没有那么糟糕。

但是您将查询分解为多个部分然后将它们组合成更复杂的查询的策略是一个很好的策略。我只会(通常)最终进行一个组合这些部分的大型查询。

于 2012-05-01T17:15:02.943 回答
1

不要为此使用视图,请使用派生表、临时表或 CTES。视图是数据库中的永久对象,过度使用它们是一个真正的问题,尤其是当您开始编写调用其他视图的视图时。我们几乎失去了一个价值数百万美元的客户,因为开发人员被错误地告知视图是一件好事,使系统变得如此缓慢,以至于在加载数据后无法使用。初学者永远不需要编写视图。

学习使用真正的连接——它会让你变得更好。

但是,是的,可以将复杂的事物分成块。只是不要通过使用视图来做到这一点。

隐含连接是一种非常糟糕的技术,它们已经过时了 20 年,没有理由在 2012 年使用它们。保证自己永远不会再使用它们。不要学不好的技术,要学习正确的技术。

我会做类似的事情(未经测试):

SELECT  MDByPatient.pname,MDByPatient.pid,MDByPatient.cid
FROM 
    (
    SELECT   p.pname,p.pid,p.cid, count(v.did) as CountMDByPatient
    FROM  Patient p  
    INNER JOIN (SELECT DISTINCT v.pid, v.did FROM Visits) v
        ON p.pid = v.pid
    INNER JOIN Doctors d 
        ON d.did = v.did and p.cid = d.cid
    WHERE d.speciality='Orthopedist' 
    GROUP BY p.pname,p.pid,p.cid
    ) MDByPatient
INNER JOIN 
    (
    SELECT cid, count(did)as CountMDByIns
    FROM Doctors 
    WHERE d.speciality='Orthopedist' 
    GROUP BY cid
    ) MDByInsurance
        ON  MDByPatient.cid = MDByInsurance.cid
where MDByPatient.CountMDByPatient = MDByInsurance.CountMDByIns

您会看到它仍然被分成几块,一个是通过保险公司获取骨科医师的数量,另一个是通过保险公司和访问者获取骨科医师的数量。我还做了一个“SELECT DISTINCT v.pid, v.did FROM Visits”,因为我不希望医生的数量不正确,因为我不止一次拜访了同一个人。

于 2012-05-01T18:57:15.360 回答