【问题标题】:SQL Inner join divisionSQL 内连接划分
【发布时间】:2011-10-04 03:38:45
【问题描述】:

我对下面的内部连接部门有疑问。从我的预言中,当我已经关闭它时,它一直提示我缺少右括号。我需要获取收集所有物品的患者的姓名。

Select P.name
From ((((Select Patientid From Patient) As P
Inner Join (Select Accountno, Patientid From Account) As A1
on P.PatientID = A1.PatientID)
Inner Join (Select Accountno, Itemno From AccountType) As Al 
On A1.Accountno = Al.Accountno)
Inner Join (Select Itemno From Item) As I
On Al.Itemno = I.Itemno)
Group By Al.Itemno
Having Count(*) >= (Select Count(*) FROM AccountType);

【问题讨论】:

    标签: sql oracle inner-join division


    【解决方案1】:

    这是一个更简单的方法,我认为它基本上是等效的:

    select a.name
    from Patient a
    inner join Account b on a.PatientID = b.PatientID
    inner join AccountType c on b.Accountno = c.Accountno
    inner join Item d on c.Itemno = d.Itemno
    group by c.Accountno, a.name
    having Count(*) >= (Select Count(*) FROM AccountType);
    

    这种方法稍微简单一些。它还有一个额外的好处是更有可能在表上使用索引——如果你在内存中本质上是“连接表”的东西之间进行连接,你就不会从物理表中存在的索引中受益记忆。

    我通常也使用连续字母为表名命名——如您所见,'a'、'b'、'c'、'd'。我发现当我编写复杂的查询时,它使我更容易理解。 'a' 是连接中的第一个表,'b' 是第二个,依此类推。

    【讨论】:

    • 感谢您的评论。在尝试了提供的两个答案之后。它在第 1 行提示我“不是按表达式分组”,即 p.name。但它不能按 p.name 分组。不会有任何结果显示。有什么想法吗?
    • 我编辑了查询以尝试解决这个问题。我相信它可能会奏效。基本上,要以这种方式进行选择,问题可能是 a.name 需要按列分组。虽然,如果您按 Accountno 分组,但仅选择名称,可能仍然存在一些问题。
    • 相同的结果。没有显示行。右边应该显示五行。当我加入表格时,我也没有看到任何行。有什么想法吗?
    • 不看数据真的说不出来。如果查询是正确的,这意味着问题很可能是没有与查询匹配的数据。我将首先删除 HAVING 子句并查看是否有任何数据与连接匹配。如果甚至有一个连接没有数据,连接就会失败并且不会返回任何数据。
    • 在大多数情况下,Oracle 将内联子查询并且仍然能够使用索引。但是,我仍然会推荐这个版本而不是 OP,只是为了便于阅读。
    【解决方案2】:

    听起来你只是想要

    SELECT p.name
      FROM patient p
           INNER JOIN account a ON (a.patientID = p.patientID)
           INNER JOIN accountType accTyp ON (accTyp.accountNo = a.accountNo)
           INNER JOIN item i ON (i.itemNo = accTyp.itemNo)
     GROUP BY accTyp.itemNo
    HAVING COUNT(*) = (SELECT COUNT(*)
                         FROM accountType);
    

    请注意,具有 A1 的别名和 Al 的别名是相当混乱的。您想选择更有意义和更有区别的别名。

    【讨论】:

    • 我在第 1 行显示 not a group by expression 的错误。这是 oracle 想要我按 p.name 分组。但这是不可能的。不会有任何记录显示
    猜你喜欢
    • 2013-05-04
    • 2011-03-16
    • 2015-03-09
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多