根据列中的文本和不同表的列中的不同文本从表1中获取数据

时间:2015-06-27 16:56:37

标签: sql phoenix

我有两张桌子。

表1:

T1id1(pk) col1 col2 col3

表2:

id(pk) T1id1(FK) col1 col2 col3

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

我需要从table1获取一组100条记录,其中table2 col1包含text2 AND 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);

1 个答案:

答案 0 :(得分:0)

鉴于您使用ILIKE,您可能尝试使用PostgreSQL - 它似乎在单个语句中允许多个LIMIT。 (从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子句很重要   将结果行限制为唯一的顺序。否则你会得到   查询行的不可预测的子集。你可能会要求   第十到第二十排,但第十到第二十排   排序?除非您指定了ORDER BY。否则排序是未知的。

来自PostgreSQL 9.3文档7.6 LIMIT and 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,以指示效果。

主要是将LIMITOFFSET结合起来 - 您似乎试图找到自己的替代品。

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

记住您使用ILIKE:只要比较中没有二进制字符串,LIKEINSTR都不区分大小写。

查看实际操作:SQL Fiddle

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