标签: sql

Oracle:带条件的全文搜索

我创建了一个Oracle Text索引,如下所示:

create index my_idx on my_table (text) indextype is ctxsys.context; 
Run Code Online (Sandbox Code Playgroud)

然后我可以做以下事情:

select * from my_table where contains(text, '%blah%') > 0;
Run Code Online (Sandbox Code Playgroud)

但是,假设我们在此表中有另一列,比如说group_id,我想要执行以下查询:

select * from my_table where contains(text, '%blah%') > 0 and group_id = 43;
Run Code Online (Sandbox Code Playgroud)

使用上面的索引,Oracle将不得不搜索包含的所有项目,'blah'然后检查它们group_id的所有内容.

理想情况下,我更喜欢只搜索项目group_id = 43,所以我想要一个像这样的索引:

create index my_idx on my_table (group_id, text) indextype is ctxsys.context; 
Run Code Online (Sandbox Code Playgroud)

有点像普通索引,因此可以为每个索引进行单独的文本搜索group_id.

有没有办法在Oracle中做这样的事情(如果这很重要,我使用的是10g)?

编辑(澄清)

考虑一个包含一百万行的表和以下两列,A以及B两个数字.假设有500个不同的值A和2000个不同的值B,每行都是唯一的.

现在我们考虑一下 select ... where A = x and B …

sql oracle indexing oracle-text full-text-indexing

11
推荐指数
1
解决办法
1万
查看次数

是否可以在选择查询中使用同一个表两次?

嗨,我有以下查询,我想知道这是什么意思:

SELECT c1.id as sender, c2.id as replier
   FROM contacts c1, contacts c2;
Run Code Online (Sandbox Code Playgroud)

你怎么能两次使用同一张桌子?

sql

11
推荐指数
2
解决办法
6万
查看次数

如何仅根据Oracle中的日期部分比较两个DATE值?

我试图通过以下查询获取最近30天的计数 -

SELECT date_occured, COUNT(*) FROM problem
WHERE date_occured >= (CURRENT_DATE - 30)
GROUP BY date_occured;

//date_occured field is of type DATE.
Run Code Online (Sandbox Code Playgroud)

基本上,在我的查询中,我试图只比较条件中的日期部分date_occured >= (CURRENT_DATE - 30),但它似乎也比较时间.

我试过TRUNC如下 -

TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30)
Run Code Online (Sandbox Code Playgroud)

但是当运行查询时它永远不会返回.

我也尝试过 -

SELECT date_occured, COUNT(*) FROM problem    
GROUP BY date_occured
HAVING TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30);
Run Code Online (Sandbox Code Playgroud)

它永远不会回来.

如何只比较Oracle中两个DATE值的日期部分?

sql oracle compare date datepart

11
推荐指数
1
解决办法
5万
查看次数

CTE,ROW_NUMBER和ROWCOUNT

我试图返回一个数据页面,并在一个存储过程中的所有数据的行计数,如下所示:

WITH Props AS
(
    SELECT *,
    ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber
    FROM Property
    WHERE PropertyType = @PropertyType AND ...
)   

SELECT * FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize);
Run Code Online (Sandbox Code Playgroud)

我无法返回行计数(最高行号).

我知道这已经讨论过了(我已经看过了: 使用row_number从查询中获取@@ rowcount的有效方法)但是当我在CTE中添加COUNT(x)OVER(PARTITION BY 1)性能降低并且上面的查询通常没有时间需要永远执行.我估计这是因为计算了每一行的数量?我似乎无法在另一个查询中重用CTE.Table Props有100k记录,CTE返回5k记录.

sql sql-server row-number rowcount common-table-expression

11
推荐指数
1
解决办法
4万
查看次数

如何让员工与他们的经理在一起

这就是我想要输出的样子:

Employee   Emp# Manager Mgr# 
   BLAKE   7698 KING    7839 
   CLARK   7782 KING    7839 
   JONES   7566 KING    7839 
   MARTIN  7654 BLAKE   7698 
   ALLEN   7499 BLAKE   7698 
   TURNER  7844 BLAKE   7698 
   JAMES   7900 BLAKE   7698 
   WARD    7521 BLAKE   7698 
   FORD    7902 JONES   7566 
   SMITH   7369 FORD    7902 
   SCOTT   7788 JONES   7566 
   ADAMS   7876 SCOTT   7788 
   MILLER  7934 CLARK   7782 
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

 SQL> SELECT ename, empno, (SELECT ename FROM EMP WHERE empno = mgr)AS MANAGER, mgr from emp order by empno;

 ENAME           EMPNO MANAGER …
Run Code Online (Sandbox Code Playgroud)

sql oracle sqlplus

11
推荐指数
2
解决办法
13万
查看次数

使用Dapper在SQL语句中使用参数化LIKE子句

我想使用Dapper执行以下查询,Dapper当前不返回预期结果(我认为它必须将@pName参数视为单引号中的文字文本?):

var q = "SELECT * FROM Users WHERE Name LIKE '@pName%'";
Run Code Online (Sandbox Code Playgroud)

@pName是我在执行查询时为其分配值的参数.

如果我只是构建SQL,事情就会起作用:

var q = "SELECT * FROM Users WHERE Name LIKE '" + name + "%'";
Run Code Online (Sandbox Code Playgroud)

..但如果可能的话,我更愿意使用param.

我正在使用以下代码执行查询:

o = _cn.Query<User>(q, new { pName = new DbString { Value = name, IsFixedLength = false, Length = 25, IsAnsi = true } }).ToList();
Run Code Online (Sandbox Code Playgroud)

我如何使用Dapper解决这个问题?

sql dapper

11
推荐指数
1
解决办法
5304
查看次数

连接两个表的表是否应该有自己的ID?

我有两张桌子:

First
------
id
name

Second
------
id
name
Run Code Online (Sandbox Code Playgroud)

另外一个表连接前两个:

Third
------
first_id
second_id
Run Code Online (Sandbox Code Playgroud)

第三个表用于解决M:N问题.它应该有自己的ID吗?

sql

11
推荐指数
4
解决办法
5597
查看次数

关系代数中"theta join"的清晰解释?

我正在寻找对关系代数中theta连接概念的清晰,基本的解释,也许是一个例子(或许使用SQL)来说明它的用法.

如果我理解正确的话,theta join是一个添加了条件的自然连接.那么,自然连接强制同名属性之间的相等(并删除副本?),theta连接做同样的事情,但添加在一个条件.我有这个权利吗?任何明确的解释,简单来说(对于非数学家)将不胜感激.

另外(对不起,最后只是把它扔进去,但它有点相关),有人可以解释笛卡尔积的重要性或想法吗?我认为我遗漏了一些关于基本概念的东西,因为对我来说它似乎只是一个基本事实的重述,即一组13 X一组4 = 52 ......

sql relational-algebra cartesian-product relational-database

11
推荐指数
1
解决办法
2万
查看次数

在CodeIgniter中使用多个数据库

免责声明:我是网络开发的新手

场景:我正在构建一个使用ion_auth管理所有用户/管理员信息(使用MySQL数据库)的Web应用程序,每个用户都有自己的数据库(MySQL也是如此)用于核心应用程序.我在CodeIgniter中的applicaton/config/database.php文件中自动加载了我用于ion_auth的数据库.我使用的是标准MVC格式(与每个数据库相关的单个模型).

问题:我需要知道如何在CodeIgniter中轻松有效地使用多个数据库.我是否需要将两个数据库模式链接在一起,或者CodeIgniter会为我做这个吗?是否有任何资源可以解决这个问题(我在寻找一个问题时遇到了麻烦)?

非常感谢你的帮助!

php mysql sql codeigniter

11
推荐指数
1
解决办法
6984
查看次数

如何根据变量选择架构?

考虑:

SET @PREFIX='DEV_';

SET @REFRESHDB=CONCAT(@PREFIX,'Refresh');

CREATE TABLE @REFRESHDB.`Metadata`
(
    `Key` VARCHAR(30) NOT NULL,
    `Value` VARCHAR(30) NOT NULL,
    PRIMARY KEY (`Key`)
) ENGINE = InnoDB;

INSERT INTO @REFRESDB.`Metadata` (`Key`, `Value`) VALUES ("Version", "0");
Run Code Online (Sandbox Code Playgroud)

这似乎没有效果:mysql回来了:

您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在'@REFRESHDB .Metadata`附近使用正确的语法

据我所知,根据文档,我已经完成了正确的事情.然而MySQL表示不允许这样做.这是MySQL的一些限制(不允许使用变量作为标识符)或其他什么?

mysql sql

11
推荐指数
2
解决办法
3390
查看次数