我有两张桌子。
表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);
答案 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,以指示效果。
主要是将LIMIT
与OFFSET
结合起来 - 您似乎试图找到自己的替代品。
除此之外:由于通配符位于字符串的两端,INSTR
具有与LIKE
相同的选择性 - 但在某些情况下效率更高......
记住您使用ILIKE
:只要比较中没有二进制字符串,LIKE
和INSTR
都不区分大小写。
查看实际操作:SQL Fiddle。
如果需要调整/进一步详细说明,请发表评论。