【问题标题】:SQL subquery result in WHERESQL 子查询结果在 WHERE
【发布时间】:2020-05-04 07:05:30
【问题描述】:

我有一个 Paths 表,其中包含 PathID(唯一)和 PathStr 列。

我想获取此表中所有以字符串开头的 PathStr 记录,这些记录来自选定的 PathID

换句话说,如果我知道根文件夹的PathID,我想获取一个文件夹的所有子文件夹。

示例表:

PathID | PathStr
-------+------------------------
   1   |  D:\Project1
   2   |  D:\Project1\Sub1   
   3   |  D:\Project1\Sub1\Sub11
   4   |  D:\Project2
   5   |  D:\Project2\Sub1

PathID = 1: 时所需的结果:

D:\Project1
D:\Project1\Sub1
D:\Project1\Sub1\Sub11

我的查询现在看起来像这样,但我坚持使用WHERE 的子查询:

SELECT P.PathStr As 'Folder'
FROM Paths AS P
WHERE P.PathStr LIKE (SELECT Paths.PathStr FROM Paths WHERE Paths.PathID = 1) + "%"

我想我不能简单地将子查询的结果与字符串连接起来,但我不知道该怎么做,我没有找到我朋友 google 的解决方案:)

子查询的结果总是一条记录。

谢谢

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • @GordonLinoff 不幸的是我不知道:/
  • 那么,您的查询是否有效?如果没有,你会收到错误吗?哪一个? (顺便说一句,您混淆了引号。在标准 SQL 中,单引号用于字符串(如'%'),双引号用于名称(如"Folder")。标准字符串连接运算符是||,而不是+,但一些 DBMS(SQL Server 是最突出的)使用 +。其他人仍然使用 CONCAT 函数。
  • 您不知道您使用的是哪个 DBMS?您不知道您使用的是 Oracle 还是 MySQL 或 SQL Server 或其他什么?那你怎么知道有哪些操作和功能可用以及参考哪些手册或在线文档?你如何连接到数据库?
  • @ThorstenKettner 这是一个项目数据管理软件。我是用户,不是管理员或 IT 人员,但我可以运行查询(称为报告)。不幸的是,它的文档很差。

标签: sql subquery concatenation


【解决方案1】:

我建议改用exists:

SELECT p.PathStr as Folder
FROM Paths p
WHERE EXISTS (SELECT 1
              FROM Paths p2 
              WHERE p2.PathId = 1 AND
                    p.PathStr LIKE CONCAT(p2.PathStr, '%')
             );

您尚未标记您的数据库。字符串连接的标准运算符是||,许多数据库也支持CONCAT() 函数。使用+ 进行字符串连接非常有限。

编辑:

解决评论中提到的问题:

SELECT p.PathStr as Folder
FROM Paths p
WHERE EXISTS (SELECT 1
              FROM Paths p2 
              WHERE p2.PathId = 1 AND
                    CONCAT(p.PathStr, '\') LIKE CONCAT(p2.PathStr, '\%')
             );

注意:在某些数据库中,反斜杠需要加倍,因此它不是转义字符。

【讨论】:

  • 小心。正如 forpas 在他们现在已删除的答案中指出的那样,'D:\Project123\Sub1' 将被视为带有此类查询的'D:\Project1' 的子文件夹。你可能想要这个CONCAT(p.PathStr, '\') LIKE CONCAT(p2.PathStr, '\%')
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多