【问题标题】:SQL INNER JOINing 2 SubqueriesSQL INNER JOINing 2 子查询
【发布时间】:2016-02-09 18:45:02
【问题描述】:

我正在尝试将这两个子查询(我认为这就是所谓的)内部连接在一起,其中第一个查询的 branchName 等于第二个查询的 branchName。

但是,他们似乎不想联合起来,而且由于我对 SQL 的了解有限,我似乎无法找到解决此问题的方法。我尝试在各种位置移动括号,但它也不喜欢那样。

SELECT * 
FROM
(
SELECT B.branchName, A.type, AVG (T.amount), COUNT(A.accNumber)
FROM Branch B, Account A, Transactions T
WHERE 
    B.branchNumber = A.branchNumber AND
    A.accNumber = T.accNumber
GROUP BY B.branchName, A.type
)

INNER JOIN

(
SELECT B1.branchName, COUNT(A1.accNumber)
FROM Account A1, Branch B1
WHERE 
      A1.branchNumber = B1.branchNumber 
GROUP BY B1.branchName
HAVING COUNT(A1.accNumber) > 5
)
ON
 B.branchName = B1.branchName

【问题讨论】:

  • 两个子查询应该有相同的列数和相同的数据类型
  • @pablomatico - 为什么会这样?
  • @pablomatico 对于union 的两个部分都是正确的,但对于join 则不然
  • @Andomar,阿米特。完全正确。我误读了这个问题。很抱歉!

标签: sql tsql subquery inner-join


【解决方案1】:

为了使查询工作,您需要命名内部选择(子查询):

SELECT * 
FROM
(
SELECT B.branchName, A.type, AVG (T.amount), COUNT(A.accNumber)
FROM Branch B, Account A, Transactions T
WHERE 
    B.branchNumber = A.branchNumber AND
    A.accNumber = T.accNumber
GROUP BY B.branchName, A.type
) q1

INNER JOIN

(
SELECT B1.branchName, COUNT(A1.accNumber)
FROM Account A1, Branch B1
WHERE 
      A1.branchNumber = B1.branchNumber 
GROUP BY B1.branchName
HAVING COUNT(A1.accNumber) > 5
) q2
ON
 q1.branchName = q2.branchName

【讨论】:

  • 第二个建议会给出不同的结果吗?原文说“每个 (branchName) group with more than 5 accNumber”,您建议的查询说“each (branchname, type) group with more than 5 accNumber”。
  • @Andomar - 哈!你说得对! unreadable 查询让我很困惑 :-)
  • 哈哈抱歉让它看起来很混乱 xD,刚开始使用 SQL。不过非常感谢!!!我不知道你必须这样命名内部选择。
  • 哦,实际上我现在看到了...就像我一直在命名我的其他表分支 B、帐户 A 和事务 T 一样,我也必须这样命名子查询:D
【解决方案2】:

您应该为每个子查询设置名称列。试试这个:

SELECT * 
FROM
(
   SELECT B.branchName, A.type, AVG (T.amount) AS [AVG], COUNT(A.accNumber) AS [COUNT]
   FROM Branch B, Account A, Transactions T
   WHERE 
       B.branchNumber = A.branchNumber AND
       A.accNumber = T.accNumber
   GROUP BY B.branchName, A.type
) AS T1   
INNER JOIN   
(
   SELECT B1.branchName, COUNT(A1.accNumber) AS [COUNT]
   FROM Account A1, Branch B1
   WHERE 
      A1.branchNumber = B1.branchNumber 
   GROUP BY B1.branchName
   HAVING COUNT(A1.accNumber) > 5
) AS T2
ON
 T1.branchName = T2.branchName

【讨论】:

  • 为什么要添加这个答案?和我(已经接受)的答案有什么不同吗?
  • 列名别名:COUNT(..) AS [COUNT]
猜你喜欢
  • 2010-12-19
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2017-12-21
相关资源
最近更新 更多