【问题标题】:Getting LIMIT value from table in SQL从 SQL 中的表中获取 LIMIT 值
【发布时间】:2020-05-18 10:07:41
【问题描述】:

我正在尝试在 SQL 中运行插入语句一段固定的时间。到目前为止,我已经尝试过了,它可以按我的意愿工作,但是有没有办法将这两个部分结合起来?

INSERT INTO assigns (AgencyName, ScoutID, RequestID)
SELECT AgencyName, ScoutID, RequestID
FROM employs NATURAL JOIN Scout NATURAL JOIN agency_response NATURAL JOIN Request
WHERE Answer = @option AND AgencyName = @agency_name
LIMIT 1;

这插入到分配表1中。但是我在从 NATURAL JOIN 获得的表中有所需的 LIMIT 值。在这种情况下,它存储在 NumberOfScouts 中。下面以 8 为例,我想限制为 8。

SELECT NumberOfScouts
FROM employs NATURAL JOIN Scout NATURAL JOIN agency_response NATURAL JOIN Request
WHERE Answer = @option AND AgencyName = @agency_name;

有什么方法可以从我使用的表中获取 LIMIT 中使用的整数值。我试图将 LIMIT 放在查询的上部,但它给出了语法错误。

【问题讨论】:

  • 今天的提示:忘记 NATURAL JOIN 构造。控制,指定连接条件。

标签: mysql sql limit sql-insert


【解决方案1】:

你可以使用窗口函数:

WITH asr as (
      SELECT ?.AgencyName, ?.ScoutID, ?.RequestID, ?.NumberOfScouts,
             ROW_NUMBER() OVER (ORDER BY ?.AgencyName) as seqnum
      FROM employs e JOIN
           Scout s
           ON ?? JOIN    -- JOIN conditions here
           agency_response ar
           ON ?? JOIN    -- JOIN conditions here
           Request r
           ON ??         -- JOIN conditions here
     WHERE ?.Answer = @option AND ?.AgencyName = @agency_name
    )
SELECT ?.AgencyName, ?.ScoutID, ?.RequestID
FROM asr
WHERE seqnum <= NumberOfScouts;

注意事项:

  • 使用作为表名缩写的表别名。
  • 限定所有列引用,以便您和其他所有人都知道表列的来源。
  • JOINON/USING 一起使用,这样您就知道JOINs 使用了哪些列。

我将NATURAL JOIN 描述为可憎,因为它没有为JOIN 条件使用正确声明的外键关系。另外,我的大多数表都有createdAtcreatedBy 列,这会混淆所谓的“自然”连接。

【讨论】:

  • in ?.AgencyName, ?.ScoutID 等“?”的含义别名不是表吗?即我可以将 ?.AgencyName 替换为 e.AgencyName
  • 是的。 ? 用于表别名。
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 2017-04-25
  • 2015-08-13
  • 1970-01-01
  • 2022-11-28
  • 2012-02-12
  • 2017-03-03
  • 2022-07-06
相关资源
最近更新 更多