2016-03-05 19 views
0

我们正在研究关于数据库的讲座,我们不确定我们的解决方案是否是解决此类问题的正确方法。如何加入多个表格并找到对

以下方案中给出: enter image description here

相关关系的转换:

  • 讲座(LectureID [PK],LectureTitle,ProfInitials
  • VG(LectureID [PK,FK1],SubjectTitle [PK,FK2]
  • 主题(Titel的 [PK],说明)

的任务是找到对讲座( “Vorlesung”)有一个主题(” Gebiet“)。结果表格应包含两个讲座的名称(“VTitel”)和共享主题的标题(“Titel”)。

我们想出了是

SELECT "T1"."VTitel", "T2"."VTitel", "T1"."Titel" 
FROM (SELECT v1."VTitel", "Titel" FROM "Vorlesung" v1 NATURAL JOIN "VG" g) AS "T1" 
JOIN (SELECT v1."VTitel", "Titel" FROM "Vorlesung" v1 NATURAL JOIN "VG" g) AS "T2" 
ON "T1"."Titel" = "T2"."Titel" AND "T1"."VTitel" <> "T2"."VTitel"; 

这是解决这个正确的方法或者是有一个更简单的方法来做到这一点的soulution?

+0

您正在使用哪种数据库管理系统? MySQL,SQL-Server,PostgreSQL,Oracle?还有别的吗? –

+0

'NATURAL JOIN'不包括SQL Server。你有一个ANSI SQL测试RDBMS吗? –

+0

PostgreSQL用于测试目的。但是我们必须使用标准的SQL-92。 – masinger

回答

1

看起来它会给你正确的答案,但实际上它通常更快(并且通常尽管不总是更可读),以避免嵌套的子查询。我假设你有关于关系代数的一些讲座,所以你会注意到,如果你将你的查询翻译成关系形式,结果会变得相当长(我重命名了你的表和列,并用this site来生成它,但你应该自己动手手工; S是Vorlesung和T是VG,b和d是每个表中的两个字段):

π T1.b, T2.b, T1.d ρ T1 (π v1.b, v1.d ρ v1 S ⨝ ρ g T) ⨝ T1.d = T2.d and T1.b ≠ T2.b ρ T2 (π v1.b, v1.d ρ v1 S ⨝ ρ g T) 

这使用12个运算符。您可能不想在连接中选择内容,而是想简单地将表格中的所有实例重命名为不同的名称,然后将它们一起加入!

SELECT V1.VTitel, 
     V2.VTitel, 
     VG1.Titel 
    FROM Vorlesung AS V1 
    JOIN VG AS VG1 
    ON VG1.VNummer = V1.VNummer 
    JOIN Vorlesung AS V2 
    ON V1.VTitel <> V2.VTitel 
    JOIN VG AS VG2 
    ON VG2.VNummer = V2.VNummer 
    WHERE VG2.Titel = VG1.Titel 

这给了我们一个更易于管理的9个运营商:

π V1.b, V2.b, V1.d σ VG1.b = VG2.b ρ V1 S ⨝ VG1.d = V1.d ρ VG1 T ⨝ V1.b ≠ V2.b ρ V2 S ⨝ VG2.d = V2.d ρ VG2 T 

注意我已经摆脱了自然的连接,因此我们不必担心支架和这样的;自然连接在现实生活中使用也是一件可怕的事情,但在理论上是合理的。如果你能够用自然连接重写新查询,并且如果你可以在没有where子句的情况下重新写入,那么看看你是否理解我做了什么是一个很好的练习!