【问题标题】:Combine two virtual tables from separate queries合并来自不同查询的两个虚拟表
【发布时间】:2020-01-10 08:57:28
【问题描述】:

我有两个 SQL 查询。一个人退还为游泳赛事支付给公司的所有款项 另一个获得所有座位付款(与第一个分开)。

第一个有一个虚拟表结构 carnivalId, buildingCode, TotalRaces, TotalIncome

第二个是 carnivalId, SeatCosts

我想将它们组合到一个表中,以便查询以以下格式返回 carnivalId, buildingCode, TotalRaces, TotalIncome, SeatCosts

我研究了 UNION,但它似乎不是正确的方法,因为这两个查询具有不同的返回结构。

我尝试在 carnivalId 上使用内部连接来连接两者,但它只是错误 -

SELECT c.carnivalId, c.buildingCode, COUNT(r.raceId) as TotalRaces, SUM(p.amountPaid) as TotalIncome
FROM Carnival c, Race r, Payment p, Entry e
WHERE r.carnivalId = c.carnivalId
AND e.raceId = r.raceId
AND p.payId = e.payId
INNER JOIN (SELECT c.carnivalId, SUM(s.seatsBought*st.seatCost)
    FROM Carnival c, SeatsAvailable s, SeatType st
    WHERE carnivalId = c.carnivalId
    AND st.seatType = s.seatType
    GROUP BY c.carnivalId, c.buildingCode) SeatingCosts ON c.carnivalId = SeatingCosts.carnivalId
GROUP BY c.carnivalId, c.buildingCode;

我也尝试将两个查询合并为一个,但它使所有返回的值完全错误(看起来它将第一个中的所有值乘以seatsBought结果中的行数

SELECT c.carnivalId, c.buildingCode, COUNT(r.raceId) as TotalRaces, SUM(p.amountPaid) as TotalIncome, SUM(s.seatsBought*st.seatCost) as SeatCosts
FROM Carnival c, Race r, Payment p, Entry e, SeatsAvailable s, SeatType st
WHERE r.carnivalId = c.carnivalId
AND e.raceId = r.raceId
AND p.payId = e.payId
AND s.carnivalId = c.carnivalId
AND st.seatType = s.seatType
GROUP BY c.carnivalId, c.buildingCode;

第一个查询 -

SELECT c.carnivalId, c.buildingCode, COUNT(r.raceId) as TotalRaces, SUM(p.amountPaid) as TotalIncome
FROM Carnival c, Race r, Payment p, Entry e
WHERE r.carnivalId = c.carnivalId
AND e.raceId = r.raceId
AND p.payId = e.payId
GROUP BY c.carnivalId, c.buildingCode;

第二次查询——

SELECT c.carnivalId, SUM(s.seatsBought*st.seatCost) as SeatCosts
FROM Carnival c, SeatsAvailable s, SeatType st
WHERE s.carnivalId = c.carnivalId
AND st.seatType = s.seatType
GROUP BY c.carnivalId, c.buildingCode;

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    你应该加入聚合的结果,例如使用你的查询作为子查询,而不是加入分解的行

    SELECT t1.carnivalId
          , t1.buildingCode
          , t1.TotalRaces
          , t1.TotalIncome
          , t2.SeatCosts 
      FROM (
    
        SELECT c.carnivalId
          , c.buildingCode
          , COUNT(r.raceId) as TotalRaces
          , SUM(p.amountPaid) as TotalIncome
        FROM Carnival c
        INNER JOIN Race r ON r.carnivalId = c.carnivalId
        INNER JOIN Entry e ON e.raceId = r.raceId
        INNER JOIN Payment p ON p.payId = e.payId
        GROUP BY c.carnivalId, c.buildingCode
     ) t1 
    INNER JOIN (
      SELECT c.carnivalId
        , SUM(s.seatsBought*st.seatCost) as SeatCosts
      FROM Carnival c
      INNER JOIN SeatsAvailable s ON s.carnivalId = c.carnivalId
      INNER JOIN  SeatType st ON st.seatType = s.seatType
      WHERE s.carnivalId = c.carnivalId
      GROUP BY c.carnivalId, c.buildingCode
    ) t2 ON t1.carnivalId = t2.carnivalId 
        
    

    并且您应该使用基于 JOIN 显式子句的显式连接语法,并避免基于 where 子句的旧(1992 年之前)隐式连接语法。

    【讨论】:

    • 小写的select和from开头有什么原因吗?有没有影响
    • 问题在于具有多个内部连接的 MS 访问。需要此处描述的括号 -- stackoverflow.com/questions/20929332/…
    • @MarcelP 你用括号解决了吗??
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 2012-02-18
    • 2020-10-12
    • 2013-10-10
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多