【问题标题】:Not able to join two tables with limit in Postgres无法在 Postgres 中加入两个有限制的表
【发布时间】:2019-03-25 20:51:40
【问题描述】:

我有表 A 和 col1、col2、col3 和表 B col1。

我想使用限制加入两个表

我想要一些类似的东西

select a.col1,a.col2,a.col3,b.col1 
from tableA a, tableB b limit 5 and a.col1 between 1 AND 10;

所以我在表 b 中有 10 条记录,在表 a 中有 10 条记录。通过限制表 b 中的 5 条记录,我应该总共获得 50 条记录

【问题讨论】:

    标签: sql postgresql join limit


    【解决方案1】:

    您的描述转换为CROSS JOIN:

    SELECT a.col1, a.col2, a.col3, b.b_col1  -- unique column names
    FROM   tablea a
    CROSS  JOIN ( SELECT col1 AS b_col1 FROM tableb LIMIT 5 ) b;
    -- WHERE  a.col1 BETWEEN 1 AND 10;  -- see below
    

    ... 和 LIMIT for tableb 就像 a_horse 已经演示过的一样。 LIMIT 没有 ORDER BY 返回任意行。结果可以从一次执行更改为下一次执行。

    从tableb中选择随机行:

    ...
    CROSS JOIN ( SELECT col1 AS b_col1 FROM tableb ORDER BY random() LIMIT 5) b;

    如果您的桌子很大,请考虑:

    当你...

    在...表 a 中有 10 条记录

    ...添加的 WHERE 条件要么是多余的,要么是错误的,无法获得 50 行。

    虽然 SQL 允许这样做,但拥有多个同名的结果列几乎没有意义。一些客户端立即抛出错误。使用列别名使名称唯一。

    【讨论】:

    • 感谢 Erwin,这是一次查询,这对我来说很好
    • 我在表 b 中有 30 条记录,我想在使用限制时选择随机值。我尝试使用 SELECT a.col1, a.col2, a.col3, b.b_col1 -- 唯一列名 FROM tablea a CROSS JOIN ( SELECT col1 AS b_col1 OFFSET floor(random()*30) LIMIT 30) b;因为我使用的是精度 SELECT col1 AS b_col1 OFFSET floor(random()*30 它有时给我 30 有时给我 10 ..0。有没有办法我可以得到限制中提到的随机值
    • 您没有接受其他答案吗?另外:定义信息应该进入 question,而不是 cmets。不管怎样,我在上面添加了一个解决方案。
    【解决方案2】:

    为此,您需要一个派生表(又名“子查询”)。在派生表中,您可以限制行数。

    select a.col1, a.col2, b.col3, b.col1
    from tablea a
      join (
        select b.col3, b.col1
        from tableb
        limit 5 -- makes no sense without an ORDER BY
      ) b on b.some_column = a.some_column --<< you need a join condition
    where a.col1 between 1 and 10;
    

    请注意,在没有ORDER BY 的情况下使用LIMIT 通常是没有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多