有效查询合并2个以上子查询

2024-03-10

我有一个数据库

books          (primary key: bookID)
characterNames (foreign key: books.bookID) 
locations      (foreign key: books.bookID)

角色名称和位置的文本位置保存在相应的表中。
我正在使用 psycopg2 编写 Python 脚本,查找书中给定角色名称和位置的所有出现情况。我只想要书中出现的事件,其中可以找到角色名称和位置。
Here https://stackoverflow.com/q/10036645/1315186我已经找到了一种搜索一个位置和一个字符的解决方案:

WITH b AS (  
    SELECT bookid  
    FROM   characternames  
    WHERE  name = 'XXX'  
    GROUP  BY 1  
    INTERSECT  
    SELECT bookid  
    FROM   locations  
    WHERE  l.locname = 'YYY'  
    GROUP  BY 1  
    )  
SELECT bookid, position, 'char' AS what  
FROM   b  
JOIN   characternames USING (bookid)  
WHERE  name = 'XXX'  
UNION  ALL  
SELECT bookid, position, 'loc' AS what  
FROM   b  
JOIN   locations USING (bookid)  
WHERE  locname = 'YYY'  
ORDER  BY bookid, position;  

CTE“b”包含所有 bookid,其中出现角色名称“XXX”和位置“YYY”。

现在我还想知道是否要搜索 2 个地点和一个名称(或分别搜索 2 个名称和一个地点)。如果所有搜索到的实体必须出现在一本书中,那很简单,但是这样呢:
正在寻找:蒂姆、艾尔、工具店 结果:书籍包括
(蒂姆、艾尔、Toolshop)或
(蒂姆,艾尔)或
(蒂姆,工具店)或
(阿尔,工具车间)

该问题可能会在 4、5、6...条件下重复出现。
我考虑过相交更多的子查询,但这行不通。
相反,我会联合找到的 bookID,将它们分组并选择多次出现的 bookid:

WITH b AS (  
    SELECT bookid, count(bookid) AS occurrences  
    FROM  
        (SELECT DISTINCT bookid  
        FROM characterNames  
        WHERE name='XXX'  
        UNION  
        SELECT DISTINCT bookid  
        FROM characterNames  
        WHERE name='YYY'  
        UNION  
        SELECT DISTINCT bookid  
        FROM locations  
        WHERE locname='ZZZ'  
        GROUP BY bookid)  
    WHERE occurrences>1)  

我认为这可行,目前无法测试,但这是最好的方法吗?


对一般情况使用计数的想法是合理的。不过,对语法进行了一些调整:

WITH b AS (  
   SELECT bookid
   FROM  (
      SELECT DISTINCT bookid  
      FROM   characterNames  
      WHERE  name='XXX'  

      UNION ALL  
      SELECT DISTINCT bookid  
      FROM   characterNames  
      WHERE  name='YYY'  

      UNION ALL
      SELECT DISTINCT bookid  
      FROM   locations  
      WHERE  locname='ZZZ'  
      ) x
   GROUP  BY bookid
   HAVING count(*) > 1
   )
SELECT bookid, position, 'char' AS what
FROM   b
JOIN   characternames USING (bookid)
WHERE  name = 'XXX'

UNION  ALL
SELECT bookid, position, 'loc' AS what
FROM   b
JOIN   locations USING (bookid)
WHERE  locname = 'YYY'
ORDER  BY bookid, position;

Notes

  • Use UNION ALL (not UNION)以保留子查询之间的重复项。在这种情况下,您希望它们能够计算它们。

  • 子查询应该产生不同的值。它适用于DISTINCT你拥有它的方式。你可能想尝试GROUP BY 1相反,看看它是否表现更好(我不希望它表现得更好。)

  • The GROUP BY必须走出子查询。它只会应用于最后一个子查询,并且在那里没有意义,因为你有DISTINCT bookid已经。

  • 检查一本书是否有多个点击必须进入HAVING clause:

     HAVING count(*) > 1
    

    您不能在WHERE clause.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效查询合并2个以上子查询 的相关文章

  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • Python sys.modules 包含尚未导入的模块

    我试图了解加载的模块与导入的模块之间的区别 如果有的话 我正在使用 Python 2 7 3 并且只是从命令行运行 Python 如果我执行 import sys sys modules 我得到一个列表 其中包括os 例如 文档说sys m
  • dask apply:AttributeError:“DataFrame”对象没有属性“name”

    我有一个参数数据框 并对每一行应用一个函数 该函数本质上是几个 sql queries 和对结果的简单计算 我正在尝试利用 Dask 的多处理 同时保持结构和界面 下面的例子有效并且确实有显着的提升 def get metrics row
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • 无法在我的程序中使用 matplotlib 函数

    我正在 Windows 10 中运行 Anaconda 安装 conda 版本 4 3 8 这是我尝试在 python 命令行中运行的代码 import matplotlib pyplot as plt x 1 2 3 4 y 5 6 7
  • 打印一份拥有多个家庭的人员名单,每个家庭都有多个电话号码

    我有一类 Person 它可以有多个 Home 每个 Home 都有一个或多个电话号码 我已经定义了类 但现在我正在尝试创建一个视图 其中列出每个人的所有家庭以及每个家庭地址的所有电话号码 类似于 john smith 123 fake s
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 我可以在 if 语句中使用“as”机制吗

    是否可以使用as in if类似的声明with我们使用的 例如 with open tmp foo r as ofile do something with ofile 这是我的代码 def my list rtrn lst True if
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 如何从 postgresql 函数或触发器发送一些 http 请求

    我需要通过 http 协议 GET 或 POST 请求 从函数或触发器发送数据 是否可以 您可以尝试用 PL Python 编写触发器并使用 urllib2 进行 POST
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 当训练和测试的特征数量不同时,如何处理生产环境中的One-Hot Encoding?

    在做某些实验时 我们通常在 70 上进行训练 在 33 上进行测试 但是 当您的模型投入生产时会发生什么 可能会发生以下情况 训练集 Ser Type Of Car 1 Hatchback 2 Sedan 3 Coupe 4 SUV 经过

随机推荐

  • Umbraco:列出用户控件中的子节点

    我有一个用户控件 需要根据parentID 返回子节点 我能够获取parentID 但不知道返回子节点的语法 获取子节点非常简单 不确定您的代码有多远 所以这里是一个包含各种选项的完整示例 using umbraco presentatio
  • 链接多个共享库,这些共享库全部链接到一个公共静态库

    假设您有 2 个共享库 lib1 so 和 lib2 so 它们都静态链接了 libcommon a 如果要动态链接 lib1 so 和 lib2 so 编译器会抱怨符号引用不明确吗 或者编译器是否足够聪明 知道 libcommon 符号在
  • 存储过程、MySQL 和 PHP

    这是一个相当开放的问题 我已经在 MS SQLServer 中使用存储过程以及经典 ASP 和 ASP net 一段时间了 并且非常喜欢它们 我正在从事一个小型爱好项目 由于各种原因 我选择了 LAMP 路线 有什么提示 技巧 陷阱或良好的
  • 例如,C++0x auto 关键字的含义是什么?

    auto a Foo
  • 将320x240x3点云矩阵转换为320x240x1深度图

    有人可以用Python帮我解决以下问题吗 我有从虚拟相机获得的点云矩阵 其尺寸为 320x240x3 表示每个点 相机视图中的点 的 x y z 坐标 所有值的范围都从负到正 如何将此点云矩阵转换为存储每个像素的正深度值的 320x240x
  • 在 Swift 3 中使用选择器

    我正在用 Swift 3 编写我的 iOS 应用程序 我有一个UIViewController扩展 我必须检查控制器实例是否响应方法 下面是我尝试的代码 extension UIViewController func myMethod if
  • 如何使用 WorkManager 更改定期工作请求周期而不立即运行?

    val request PeriodicWorkRequestBuilder
  • 使用R的lm(),公式对象应该作为字符传递?

    我发现 R 使用 lm 时有一个奇怪的行为 基于cars对象 以下函数是在速度 30 时使用局部线性回归绘制拟合断裂距离 func1 lt function fm spd w lt dnorm cars speed spd sd 5 fit
  • Jenkins 与 intellij 共享库

    我开始实现 Jenkins 共享库并尝试使用 intellij 作为我的 ide 编写我的 jenkinsfile 如何从共享 lib 存储库获取函数到其中包含 jenkins 文件的其他存储库 只是为了澄清从 jenkins 运行时对我有
  • 查找数组的第一个重复项

    我决定学习 python 并使用 CodeFight 进行训练 第一个面试练习是找到数组的第一个重复项并返回它 如果没有则返回 1 这是我写的代码 def firstDuplicate a b print len a for i in ra
  • 当两个命令都存在时,在 jupyter 中使用“%”比使用“!”有优势吗?

    例如当我使用 pip install VSCode 建议我使用 pip install 同样有一个版本mv对彼此而言 and 使用其中一种比另一种有优势吗 Yes pip在大多数边缘情况下 将正确解析适当的虚拟环境 当前内核使用的虚拟环境
  • 如何在 Spring WebClient 中一次设置多个标头?

    我试图为我的其余客户端设置标头 但每次我都必须写 webclient get uri blah blah header key1 value1 header key2 value2 如何使用 headers 方法同时设置所有标头 如果这些标
  • Cloudinary api - 解决承诺

    我想编写一个函数 返回一个布尔值 指示我的 Cloudinary 空间中是否已存在具有指定 public id 的图像 我可以使用以下代码将结果记录到控制台 function isUploaded public id cloudinary
  • 不可能的布局?

    我开始认为这是不可能的 但我想我会问你们 基本上它是一个 2 列布局 但 业务 需要以下内容 始终占据整个浏览器窗口 适应浏览器窗口大小的调整 左栏的宽度是固定的 但该宽度在不同页面上应该是灵活的 左列顶部有一个固定高度的区域 左栏有一个底
  • 所有 mysql 引擎之间的主要区别是什么?

    我想总结一下所有 Mysql 引擎之间的主要区别 当然也包括最流行的引擎 我应该使用什么标准来确定使用哪个引擎 这里对它们进行了很好的描述 http dev mysql com doc refman 5 0 en storage engin
  • 如何更改 tcsh 提示符以显示当前工作目录?

    我在用tcsh我正在寻找一种响应式工作目录 我至少想显示最后一个文件夹名称而不是获取完整路径 想象我当前的工作目录是 user hostname home us Desktop my projects 然后我想显示这样的提示 user ho
  • 获取 Librosa 中与 STFT 相关的频率

    使用时librosa stft 要计算频谱图 如何获取相关的频率值 我对生成图像不感兴趣 如librosa display specshow 而是我希望掌握这些价值观 y sr librosa load recordings high pi
  • Azure 媒体播放器无法在 iPhone 上使用 AES 保护

    我们在 iPhone 6 A1586 上播放受 AES 使用 JWT 令牌身份验证 保护的视频时遇到问题 欠费错误如下 0x50300000 视频播放因损坏问题而中止 或者因为视频使用了您的浏览器不支持的功能 禁用加密后 播放相同的视频不会
  • Google 脚本可跨多个工作表工作

    我是 Google 脚本的新手 所以如果这个问题已经得到解答 我深表歉意 我有一个包含多个工作表的电子表格 其中一些工作表上有一个状态列 使用我已经发现的代码 我可以根据状态列中单元格中的值设置整个行颜色 我遇到的问题是我只能让代码在一张纸
  • 有效查询合并2个以上子查询

    我有一个数据库 books primary key bookID characterNames foreign key books bookID locations foreign key books bookID 角色名称和位置的文本位置