0

您好,我想将 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 ?;`

实际上,我想获得其他查询联合的相交。

4

2 回答 2

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?;
于 2020-10-05T19:28:24.503 回答
1

如果我正确理解您的问题,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

于 2020-10-05T19:34:09.510 回答