【问题标题】:How to intersect 2 subqueries如何相交 2 个子查询
【发布时间】:2020-10-06 03:34:09
【问题描述】:

您好,我想将 2 个长查询相互交叉,但我发现您只能与简单查询相交。这有可能得到这样的东西吗?

`SELECT id, name as antibodyName FROM Antibodies WHERE
                id IN 
                ((SELECT id FROM Antibodies WHERE name LIKE ?
                UNION all
                SELECT antiId FROM AssignedColors WHERE name LIKE ?
                UNION all
                SELECT antiId FROM AssignedReactivities WHERE name LIKE ?)
                INTERSECT
                (SELECT id FROM Antibodies WHERE name LIKE ?
                  UNION all
                  SELECT antiId FROM AssignedColors WHERE name LIKE ?
                  UNION all
                  SELECT antiId FROM AssignedReactivities WHERE name LIKE ?)
                )
                AND dateOfCreation >= ? AND dateOfCreation <= ?
                ORDER BY dateOfCreation DESC LIMIT ? OFFSET ?;`

其实我想得到其他查询联合的交集。

【问题讨论】:

    标签: sql sqlite node-sqlite3


    【解决方案1】:

    您必须对每组联合查询使用SELECT 语句:

    SELECT id, name as antibodyName 
    FROM Antibodies 
    WHERE id IN (
      SELECT id FROM
      (
        SELECT id FROM Antibodies WHERE name LIKE ?
        UNION all
        SELECT antiId FROM AssignedColors WHERE name LIKE ?
        UNION all
        SELECT antiId FROM AssignedReactivities WHERE name LIKE ?
      )
      INTERSECT
      SELECT id FROM
      (
        SELECT id FROM Antibodies WHERE name LIKE ?
        UNION all
        SELECT antiId FROM AssignedColors WHERE name LIKE ?
        UNION all
        SELECT antiId FROM AssignedReactivities WHERE name LIKE ?
      )
    ) AND dateOfCreation >= ? AND dateOfCreation <= ?
    ORDER BY dateOfCreation DESC LIMIT ? OFFSET?;
    

    【讨论】:

    • 有没有办法在 SQL 中进行多词搜索?因为我写这个是为了做 2 个词的搜索
    • 多词搜索之类的?
    • 例如,如果用户搜索“red 200”,则应返回颜色为红色且名称为 200 的抗体,如果用户搜索“red 200 blue”,则应返回带颜色的抗体红色和名称 20,颜色为蓝色。我的意思是我想搜索这些单词中的每一个并找到所有结果的交集。
    • 如果您指的是查询中的表,可能会有更简单的解决方案,但如果没有示例数据和预期结果,我无法确定。因此,请在您提供所有这些信息的地方发布一个问题,以阐明您想要什么。
    • 好的,谢谢我在这里提出问题stackoverflow.com/questions/64220018/…
    【解决方案2】:

    如果我正确理解您的问题,INNER JOIN 将有助于最有效地解决问题。内部的 INSERSECT 可以改成下面的代码,外部的 SELECT 可以保持不变。

    (SELECT id FROM Antibodies WHERE name LIKE ?
    UNION all
    SELECT antiId FROM AssignedColors WHERE name LIKE ?
    UNION all
    SELECT antiId FROM AssignedReactivities WHERE name LIKE ?) A
    JOIN
    (SELECT id FROM Antibodies WHERE name LIKE ?
    UNION all
    SELECT antiId FROM AssignedColors WHERE name LIKE ?
    UNION all
    SELECT antiId FROM AssignedReactivities WHERE name LIKE ?) B
    ON A.id = B.id
    
    

    【讨论】:

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