【问题标题】:Cross join ignores where clause交叉连接忽略 where 子句
【发布时间】:2023-04-01 21:48:01
【问题描述】:

表:购物

shop_id shop_building shop_person  shop_time
1   1   Brian   40
2   2   Brian   31
3   1   Tom    20
4   3   Brian   30

表格:建筑物

building_id building_city
1     London
2     Newcastle 
3     London
4     London

桌子:香蕉

banana_id  banana_building banana_amount  banana_person
1      2     1      Brian
2      3     1       Brian
2      1     1      Tom

我现在希望它显示每个人在伦敦购买的香蕉数量。

我使用了这个代码:

SELECT tt.*, tu.*, tz.*,
           SUM(shop_time)           AS shoptime, 
           Ifnull(banana_amount, 0) AS bananas 
    INNER JOIN buildings tu ON tt.shop_building=tu.building_id
    FROM   shopping tt 
           LEFT OUTER JOIN (SELECT banana_person, banana_building,
                                   SUM(banana_amount) AS banana_amount 
                            FROM   bananas 
                            GROUP  BY banana_person) tz 
             ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building
 WHERE tu.building_city = 'London'
    GROUP  BY shop_person; 

但它不起作用。好像我说得太晚了,它应该只看伦敦,因为它忽略了这一点。

【问题讨论】:

    标签: join where-clause cross-join


    【解决方案1】:

    试试这个方法:

    SELECT 
        s.shop_person, sum(b.banana_amount) as Amt, , sum(shop_time) as TimeAmt
    FROM bananas b
        INNER JOIN buildings bu ON b.banana_building = bu.building_id
        INNER JOIN shopping s ON bu.building_id = s.shop_building
    WHERE
        bu.building_city = N'London'
    GROUP BY s.shop_person
    

    此查询有所不同,但它可以满足您的需求 - '每个人在伦敦购买的香蕉数量'

    【讨论】:

    • 恐怕不走运,它仍然会忽略它并计算香蕉表中的所有内容。
    • 您是否可以使用上述查询?
    • 恐怕不行,因为我需要代码与我在 OP 中发布的代码非常相似,如果可能的话(原因:stackoverflow.com/questions/4639722/…
    • 嗯...所以,请定义您想查看的查询。
    【解决方案2】:

    在不知道您使用的是什么数据库的情况下,这里是 mssql 的工作版本。 我实际上重建了表格以确保它是正确的。

    对于其他数据库系统,您可能必须在 SELECT 语句中使用 ISNULL 以外的其他函数。

    SELECT tt.shop_person,
        tt.shop_building,
        SUM(tt.shop_time) AS shoptime,
        ISNULL(SUM(tz.banana_amount), 0) AS bananas
    FROM dbo.shopping tt
    INNER JOIN dbo.buildings tu ON tt.shop_building = tu.building_id
    LEFT OUTER JOIN
        (SELECT banana_person, banana_building, SUM(banana_amount) AS banana_amount
            FROM bananas
            GROUP BY banana_person, banana_building) tz
        ON tt.shop_person = tz.banana_person AND tt.shop_building = tz.banana_building
    WHERE (tu.building_city = 'London')
    GROUP BY tt.shop_person, tt.shop_building
    

    我必须在 tz.banana_amount 周围添加一个聚合函数 - 哪个(SUM、MIN、MAX)无关紧要。

    结果:

    shop_person shop_building shoptime bananas
    Brian       1             40       0
    Tom         1             20       1
    Brian       3             30       1
    

    我在bananas 等中使用了不同的金额,它工作正常。

    【讨论】:

    • 编辑了我的第一篇文章。恐怕我也需要购物桌,所以代码必须看起来与我在第一篇文章中的代码非常相似(原因:stackoverflow.com/questions/4639722/…
    • 实际上,我不会在带有 group by 子句的查询中包含任何 * 作为选择参数。 “漂亮”是什么意思?
    • 顺便说一句,子查询 tz 仍然缺少香蕉建筑列
    • “漂亮”是指它显然不应该与我的代码相同,因为我的代码不起作用。但如果可能的话,它需要尽可能接近。这次编辑正确:)
    • IT 不一样 - 您的子查询的 group by 子句中仍然没有banana_building。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2015-08-15
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多