问题标签 [scalar-subquery]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
305 浏览

sql-server-2008 - 找到检查行的 SQL 标量子查询

介绍

有时,您可以故意使用标量子查询来检查是否找到了不超过一行,而不是连接。例如,您可能有此查询来查找某些person行的国籍。

select p.name, c.iso from person p join person_country_map pcm on p.id = pcm.person join country c on pcm.country = c.id where p.id in (1, 2, 3)

现在,假设person_country_map不是函数映射。一个给定的人可能会映射到多个国家 - 因此连接可能会找到不止一行。或者实际上,一个人可能根本不在映射表中,至少就任何数据库约束而言。

但是对于这个特定的查询,我碰巧知道我要查询的人将只有一个国家。这是我基于我的代码的假设。但我想在可能的情况下检查这个假设 - 这样如果出现问题并且我最终尝试为一个拥有多个国家或没有国家映射行的人执行此查询,它就会死掉。

最多为一行添加安全检查

要检查多于一行,可以将连接重写为标量子查询:

select p.name, ( select c.iso from person_country_map pcm join country c on pc.country = c.id where pcm.person = p.id ) as iso from person p where p.id in (1, 2, 3)

现在,如果一个人查询到两个或多个国家的地图,DBMS 将给出错误。它不会像直接连接那样为同一个人返回多个条目。因此,即使在任何行返回到应用程序之前,我也可以更轻松地知道这个错误案例正在被检查。作为一个细心的程序员,我当然也可能会检查应用程序。

是否可以对 找到行进行安全检查?

但是如果 person_country_map 中没有一个人的行怎么办?在这种情况下,标量子查询将返回 null,使其大致相当于左连接。

(为了论证,假设从 person_country_map.country 到 country.id 的外键和 country.id 上的唯一索引,这样特定的连接将始终成功并准确找到一个国家行。)

我的问题

有什么方法可以在 SQL 中表达我想要一个且完全是一个结果吗?一个普通的标量子查询是“零或一”。我想能够说

select 42, (select exactly one x from t where id = 55)

如果子查询不返回行,则查询在运行时失败。当然,上面的语法是虚构的,我相信它不会那么容易。

我使用的是 MSSQL 2008 R2,实际上这段代码是在一个存储过程中,所以如果有必要我可以使用 TSQL。(显然,普通的声明性 SQL 更可取,因为它也可以在视图定义中使用。)当然,我可以进行exists检查,或者我可以在 TSQL 变量中选择一个值,然后显式检查它是否为空,等等。我什至可以将结果选择到一个临时表中,然后在该表上构建唯一索引作为检查。但是,是否没有更易读和更优雅的方式来标记我的假设,即子查询只返回一行,并让 DBMS 检查该假设?

0 投票
2 回答
834 浏览

sql - 子查询在 SQL SErver 2008 中返回超过 1 个值

请参阅我之前仍然坚持的问题。 带有子查询的插入语句

我有 4 列需要处理,我无法删除表以将第 4 列从 int not null 更改为

我是从这个原始声明中得到指示的:

它抛出错误:

无法将值 NULL 插入列“LineSequence”、表“ADVNET.dbo.KenCatItemTest”;列不允许空值。插入失败。该语句已终止。

所以现在我正在看这个声明:

这个新语句会引发错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。消息 515,级别 16,状态 2,第 5 行无法将值 NULL 插入列“ItemId”,表“ADVNET.dbo.KenCatItemTest”;列不允许空值。插入失败。该语句已终止。

0 投票
1 回答
2690 浏览

sql-server - 如何将计算出的列值用于同一 SQL 查询中的另一列

我正在编写一个查询,它使用 SubQuery 来获得一些结果。

我不想每次都重写子查询,而是想将第 1 列的相同输出值用作另一列的输入以进行进一步计算。

第 1 点:我们可以使用任何变量将值保存到其中并将其用于另一列。

示例预期代码:

0 投票
1 回答
69 浏览

mysql - 如何避免 MySQL 更新中相关子查询分配中的多列

我正在尝试根据社区邮政编码并将Haversine 公式与此处描述的 SQL 一起使用,将最近的位置分配给社区。我需要返回一个标量值,但我似乎无法避免使用第二个计算距离值来确定最近的位置。帮助。

0 投票
1 回答
1490 浏览

tsql - TSQL:SELECT CASE WHEN THEN 子查询:错误:子查询返回超过 1 个值

我得到了错误

在下面的查询中

(我也尝试了评论中的代码)我真的无法解释它,因为我认为通过选择一个不超过一行的不同值可以返回。我究竟做错了什么??

0 投票
0 回答
158 浏览

sql - 为什么以下查询中的标量子查询表达式没有违反规则?

Oracle 说标量子查询在以下地方不是有效的表达式:

  • 在 CASE 表达式的 WHEN 条件中

  • 在 GROUP BY 和 HAVING 子句中

但是为什么下面的查询没有给出任何错误。(不要去目的,我只是尝试一些随机的例子)

让只有一个 id 值为 60

0 投票
1 回答
30 浏览

mysql - Scalar subquery taking a lot of time to execute

I have the following tables:

  1. table1 - session_id, company_id, session_start_time
  2. table2 - id, session_id, message_time, message_type, message
  3. table3 - company_id, company_name

table1 stores the sessions done on companies. Each session has a lot of messages, which are stored in table2. For a specific message_type (say message_type = 2), a substring needs to be extracted from message. This substring is a company name. Now I need to find the next session_id from table1, where the company_id matches that of the company name extracted from message and the session_start_time >= message_time.

I am using the following query.

The original query is slightly more complicated having a few more scalar sub-queries. This query is taking exceptionally long to execute. I checked with the explain function and the scalar sub-query seems to be taking very long to execute. However, I am unable to think of a better way.

0 投票
1 回答
376 浏览

java - 更新后触发,错误:标量子查询只允许返回单行

我需要解决我的问题。提前致谢。我使用德比数据库。

我有一张桌子,几列。我在更新后为我需要的特定列创建了触发器。当我尝试更新行中的列时,出现此错误。

错误代码 30000,SQL 状态 21000:标量子查询只允许返回单行。

仅当我在主表中有两行或多行时才会出现此错误。如果我在表“帐户”中只有一行,一切正常。

这是触发器的代码:(accounts 是主表,accounts_history 新表)

0 投票
2 回答
1110 浏览

sql-server - 在“存在”函数中具有 cte 和前 1 的标量值函数

我的查询使用“存在”函数作为过滤器,并且其中包含标量值函数。标量值函数包含 cte 和“(select top 1 1)”。当我使用存在时,它根本不会过滤。相反,当我使用“where 1 =(svf)”时,它似乎有效。我在存在查询中错过了什么或任何错误吗?

p>

0 投票
3 回答
85 浏览

sql - 使用 From 子句中的 SQL 子查询计数不起作用

我正在尝试获取某个日期范围内的工作日数并将其分配给一个变量,但我似乎无法获得它。我只尝试了我的子查询,它可以很好地让我得到不同的日期,但我需要对它们进行计数。这是我希望工作的代码:

该错误表明问题在 ) 附近,我尝试将 while 放在括号中,但这也不起作用。