0

我有两张桌子。

表格1:

T1id1(pk) col1 col2 col3

表 2:

id(pk) T1id1(FK) col1 col2 col3

我从用户那里得到两个文本,其中 table1.col1 有一些文本(如 %text1%),同样对于 table2 col1,我得到另一个不等于 text1 的文本(如 %text2%)。

我需要从 table1 中获取一组一百条记录,其中 table2 col1 包含 text2并且Table1 col1 包含 text1。当查询下一组 100 时,我不应该得到第一组 100 中的任何记录。

以下是我编写的示例查询,但它失败了。我正在使用 Apache Phoenix,并且任何 SQL 兼容数据库中的解决方案都可以。

SELECT * FROM table1 WHERE T1id1 IN (select T1id1 from ndm.table1 where
T1id1 NOT IN( select T1id1 from table1 where T1id1 in (select distinct
T1id1(FK) from table2 WHERE table2.col1 like '%text2%' )LIMIT     100)     AND T1id1 in (select distinct T1id1(FK) from table2 WHERE     
table2.col1 like '%text2%' limit 200) and table1.col1 ilike '%text2%' LIMIT 100);
4

1 回答 1

0

鉴于您使用ILIKE,您可能尝试过使用 PostgreSQL - 它似乎允许LIMIT在单个语句中使用多个 s。(从这个SQL Fiddle判断,与您的语句相比 - ndm.table1已更改为table1,并且(FK)下降了两次)。

但即使经过调整

SELECT
  *
FROM table1
WHERE
  T1id1 IN
    (select
       T1id1
     from table1
     where
       T1id1 NOT IN
         (select T1id1
          from table1
          where
            T1id1 in
              (select distinct
                 T1id1
               from table2
               WHERE
                 table2.col1 like '%text2%'
              )
          LIMIT 100
         )
     AND T1id1 in
       (select distinct
          T1id1
        from table2
        WHERE
          table2.col1 like '%text2%'
        limit 200
       )
     and
     table1.col1 ilike '%text2%'
     LIMIT 100
    )
;

似乎被 PostgreSQL 接受 - 它不太可能返回预期的结果:

使用 LIMIT 时,使用 ORDER BY 子句将结果行约束为唯一顺序很重要。否则,您将获得查询行的不可预测的子集。您可能要求第 10 到第 20 行,但第 10 到第 20 行的顺序是什么?排序是未知的,除非您指定了 ORDER BY。

来自 PostgreSQL 9.3 文档7.6 LIMIT 和 OFFSET

仅从您的问题描述开始(并在您的陈述中查看一些细节),类似于以下内容

SELECT
  T1.*
FROM Table1 T1
JOIN Table2 T2
  ON T1.t1id1 = T2.t1id1
  AND INSTR(T1.col1, 'teXT1')
  AND INSTR(T2.col1, 'teXT2')
ORDER BY T1.t1id1, T2.id
LIMIT 1 OFFSET 0
;

SELECT
  T1.*
FROM Table1 T1
JOIN Table2 T2
  ON T1.t1id1 = T2.t1id1
  AND INSTR(T1.col1, 'teXT1')
  AND INSTR(T2.col1, 'teXT2')
ORDER BY T1.t1id1, T2.id
LIMIT 1 OFFSET 1
;

SELECT DISTINCT
  T1.*
FROM Table1 T1
JOIN Table2 T2
  ON T1.t1id1 = T2.t1id1
  AND INSTR(T1.col1, 'teXT1')
  AND INSTR(T2.col1, 'teXT2')
ORDER BY T1.t1id1, T2.id
LIMIT 1 OFFSET 0
;

应该让你进入正确的方向。您是否需要在DISTINCT某种程度上取决于您的数据 - 但更重要的是取决于您的整体需求。请比较 SQL Fiddle 下面的语句 1 到 4 到 5 到 7 以了解效果。

LIMIT最主要的是结合OFFSET- 你似乎试图找到你自己的替代品。

除此之外:通配符位于字符串的两端,INSTR具有与LIKE- 但在某些情况下更有效的选择性......

记住您的使用ILIKE:只要比较中不涉及二进制字符串,MySQL 中LIKE也不区分大小写。INSTR

实际操作:SQL Fiddle

如果需要调整/进一步详细信息,请发表评论。

于 2015-07-12T13:24:06.387 回答