2012-05-01 44 views
1

本学期我正在学习DBMS课程,我想确保即时通讯能够取得良好的进展并实践良好的思维,而我自己的处理查询的方法有点像分而治之 - 我将查询分解为子查询并使其查看,然后使用这些视图来简单地收集我需要的信息,总的来说,这是一个好方法吗?SQL查询,如何处理复杂的查询?

什么是替代品?

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

例:

给出:DB: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 
+0

为什么近距离投票? –

+2

既然你在学校,你应该学习现代连接语法 –

+0

@KM或许你可以给我一个它如何完成的例子吗? –

回答

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 

你看,它仍然是断裂成块,一个由保险公司来获得othopedists的数量和一个得到骨科的数量由保险公司和该人员进行访问的人员。我进一步做了'SELECT DISTINCT v.pid,v.did FROM Visits',因为我不希望医生的数量不正确,因为我不止一次地访问了同一个人。

+0

以及我目前正在阅读这本书:http://pages.cs.wisc.edu/~dbbook/ Tho我几乎没有从中学到很多,你有没有更好的书或SQL指南? –

1

这实际上取决于数据库。某些数据库(例如MySQL)在优化使用视图的查询时非常糟糕。其他人并不那么糟糕。

但是,将查询分解成多个碎片然后将这些查询合并为更复杂的查询的策略是很好的。我会(通常)最终做出一个结合这些部分的大型查询。

+0

在某些情况下,它几乎是不可能的......至少从我看到它的方式困难,然后我的方法......有任何提示? –

+0

@Ofek - 不是不可能的,但肯定更难,而且你只需要更好的经验:) –