GVKun编程网logo

筛选器表达式包含“或”时的.Net Framework DataTable.Select(String)方法(筛选器代码aiag)

30

对于想了解更改具有外键的表的读者,本文将提供新的信息,我们将详细介绍SQLServer中的记录?,并且为您提供关于copy一张老数据表(sqlserver)、mysql-如何关联两个没有外键的表?、p

对于想了解更改具有外键的表的读者,本文将提供新的信息,我们将详细介绍SQL Server中的记录?,并且为您提供关于copy一张老数据表(sqlserver)、mysql-如何关联两个没有外键的表?、postgresql – 具有复合主键的表中的记录顺序是什么、SQL Server 2016 中有外键的表无法被Truncate,只能被Delete的有价值信息。

本文目录一览:

更改具有外键的表(SQL Server)中的记录?(sql修改外键)

更改具有外键的表(SQL Server)中的记录?(sql修改外键)

有谁知道是否有一种更快的方法来编辑表(在sql server中)中具有外键的记录..我会解释..我大约有5个表具有自己的ID,但使用外键链接在一起…

因此,我需要更改外键(在我的情况下为合同编号),但是我必须将每个记录复制到新记录并以这种方式进行编辑…

就像我尝试编辑合同编号一样,它给了我与之相关的标准错误,并且违反了外键等

真的有更好的办法吗?

有任何想法吗?

答案1

您是在谈论更改PK,然后更新所有Fks吗?在这种情况下,请启用级联更新,并且删除操作将自动完成,您可以启用级联删除

删除级联

指定如果尝试删除其他表中现有行中外键引用的键的行,则包含这些外键的所有行也将被删除。如果还在目标表上定义了级联引用动作,则将从这些表中删除的行也采用指定的级联动作。

关于更新级联

指定如果尝试更新一行中的键值(其中键值由其他表中现有行中的外键引用),则所有外键值也将更新为该键指定的新值。如果级联引用动作

copy一张老数据表(sqlserver)

copy一张老数据表(sqlserver)

测试需要,但是不能动原有数据库表内容;

现在希望创建一张新表NEWTABLE,它必须有老表OLDTABLE的表结构和数据


select * into NEWTABLE from OLDTABLE;

如果只需要表结构,那么,后面加一句限制条件,如where 1=2;

select * into NEWTABLE from OLDTABLE where 1=2;

mysql-如何关联两个没有外键的表?

mysql-如何关联两个没有外键的表?

有人可以演示吗?

我正在使用MySQL,但是想法应该是一样的!

编辑

实际上,我想问的是Doctrine_Relation和Doctrine_Relation_ForeignKey在教义上有什么区别?

最佳答案
我怀疑您正在查看的是从一个数据库表到另一个数据库表的映射列.您可以使用一些字符串比较算法来做到这一点.像Levenstein或Jaro-Winkler距离这样的算法可以让您推断“匹配”列.

例如,如果db1.tableA具有L_Name列,而db2.tableB具有LastName列,则字符串距离匹配将为您获取一个度量.您可以通过比较行中的值来检查是否存在一致性,例如两个表中的值是否包含“ Smith”,“ Johnson”等,从而扩展双赢.

最近,我做了类似的事情,集成了多个大型数据库(其中一个使用另一种语言-法语!),事实证明这是非常不错的体验.

高温超导

postgresql – 具有复合主键的表中的记录顺序是什么

postgresql – 具有复合主键的表中的记录顺序是什么

在Postgresql中,当将多个列的组合指定为PRIMARY KEY时,记录是如何排序的?

这是假设Postgresql按主键的顺序排列记录.可以?

此外,Postgresql的主键是否自动编入索引?

这个问题使得错误的假设是主键强加了一个表顺序.没有Postgresql表没有定义的顺序,有或没有主键;它们是排列在页面块中的“堆”行.如果需要,使用查询的ORDER BY子句进行排序.

您可能会认为Postgresql表存储为按主键顺序存储在磁盘上的索引导向表,但这不是Pg的工作原理.我认为InnoDB存储由主键组织的表(但尚未检查),并且在某些其他供应商的数据库中使用通常称为“聚簇索引”或“索引组织表”的功能是可选的. Postgresql当前不支持此功能(至少9.3).

也就是说,PRIMARY KEY使用UNIQUE索引来实现,并且该索引有一个顺序.它从索引的左侧列(从而是主键)向上排序,就好像是ORDER BY col1 ASC,col2 ASC,col3 ASC ;. Postgresql中的任何其他b-tree(与GiST或GIN不同)索引也是如此,因为它们使用b+trees实现.

所以在表中:

CREATE TABLE demo (
   a integer,b text,PRIMARY KEY(a,b)
);

系统会自动创建相当于:

CREATE UNIQUE INDEX demo_pkey ON demo(a ASC,b ASC);

创建表时会向您报告,例如:

regress=>     CREATE TABLE demo (
regress(>        a integer,regress(>        b text,regress(>        PRIMARY KEY(a,b)
regress(>     );
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "demo_pkey" for table "demo"
CREATE TABLE

检查表格时可以看到这个索引:

regress=> \d demo
     Table "public.demo"
 Column |  Type   | Modifiers 
--------+---------+-----------
 a      | integer | not null
 b      | text    | not null
Indexes:
    "demo_pkey" PRIMARY KEY,btree (a,b)

您可以在此索引上的CLUSTER根据主键重新排列表,但它是一次性操作.系统不会维护这个顺序 – 尽管由于非默认的FILLFACTOR,如果页面空间有限,我认为它会尝试.

索引(而不是堆)的固有顺序的一个后果是,搜索速度要快得多:

SELECT * FROM demo ORDER BY a,b;
SELECT * FROM demo ORDER BY a;

比:

SELECT * FROM demo ORDER BY a DESC,b;

并且这些都不能使用主键索引,除非您在b上有索引,否则它们将执行seqscan:

SELECT * FROM demo ORDER BY b,a;
SELECT * FROM demo ORDER BY b;

这是因为Postgresql可以使用(a,b)上的索引与(a)上的索引几乎一样快.它不能使用(a,b)上的索引,就像它是(b)上的索引一样 – 甚至不是缓慢的,它只是不能.

对于DESC条目,对于那个Pg,必须进行反向索引扫描,这比普通的前向索引扫描慢.如果您在EXPLAIN ANALYZE中看到大量反向索引扫描,并且您可以承担额外索引的性能成本,您可以在DESC顺序的字段上创建一个索引.

对于WHERE子句而言,这并不只是ORDER BY.您可以使用(a,b)上的索引来搜索WHERE a = 4或WHERE a = 4 AND b = 3,但不能单独搜索WHERE b = 3.

SQL Server 2016 中有外键的表无法被Truncate,只能被Delete

SQL Server 2016 中有外键的表无法被Truncate,只能被Delete

问:


I get the following message even when the table that references it is empty: "Cannot truncate table ''dbo.Link'' because it is being referenced by a FOREIGN KEY constraint" Doesn''t seem to make much sense why this is occurring. Any suggestions?

 


In SQL Server a table referenced by a FK cannot currently be truncated even if all referencing tables are empty or the foreign keys are disabled.
You need to use DELETE (may require much more logging) or drop the relationship(s) prior to using TRUNCATE and recreate them afterwards or see the workarounds on this connect item for a way of achieving this using ALTER TABLE ... SWITCH

 

原文链接

 

今天的关于更改具有外键的表SQL Server中的记录?的分享已经结束,谢谢您的关注,如果想了解更多关于copy一张老数据表(sqlserver)、mysql-如何关联两个没有外键的表?、postgresql – 具有复合主键的表中的记录顺序是什么、SQL Server 2016 中有外键的表无法被Truncate,只能被Delete的相关知识,请在本站进行查询。

本篇文章给大家谈谈我可以在SQL UPDATE内使用内部SELECT吗?,同时本文还将给你拓展mysql --- select ...for update、MySQL SELECT ... FOR UPDATE、mysql select for update 的问题、mysql SELECT FOR UPDATE语句使用示例等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

我可以在SQL UPDATE内使用内部SELECT吗?

我可以在SQL UPDATE内使用内部SELECT吗?

我有一个像这样的数据库:

foo有列idnamebar有列idfoo_id

我有一个带有的传入HTTP查询foo.name,我想barbar.foo_idset中适当插入一行。因此,例如:

> SELECT * FROM foo;id     name------ -------1      "Andrey"(1 row)> SELECT * FROM bar;(0 rows)

给定"Andrey",是否有一个我可以执行以下查询的查询:

> SELECT * FROM bar;id     foo_id------ -------1      1(1 row)

我在考虑以下方面:

> UPDATE bar SET foo_id=(SELECT id FROM foo WHERE foo.name=?)

但这似乎是错误的,因为SELECT的返回集是值,而不是值…

答案1

你将不得不做

SELECT TOP 1 ID FROM foo where foo.name=?

但是除此之外,在更新中进行选择没有任何问题。

mysql --- select ...for update

mysql --- select ...for update

——————————— Oracle —————————————————– 
Oracle 的for update行锁

键字: oracle 的for update行锁 
  SELECT…FOR UPDATE 语句的语法如下: 
  SELECT … FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED]; 
其中: 
  OF 子句用于指定即将更新的列,即锁定行上的特定列。 
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。 
  “使用FOR UPDATE WAIT”子句的优点如下: 
  1防止无限期地等待被锁定的行; 
  2允许应用程序中对锁的等待时间进行更多的控制。 
  3对于交互式应用程序非常有用,因为这些用户不能等待不确定 
  4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

示例1: 
create table t(a varchar2(20),b varchar2(20)); 
insert into t values(‘1’,’1’); 
insert into t values(‘2’,’2’); 
insert into t values(‘3’,’3’); 
insert into t values(‘4’,’4’); 
现在执行如下操作: 
在plsql develope中打开两个sql窗口, 
在1窗口中运行sql 
select * from t where a=’1’ for update; 
在2窗口中运行sql1 
1. select * from t where a=’1’; 这一点问题也没有,因为行级锁不会影响纯粹的select语句 
再运行sql2 
2. select * from t where a=’1’ for update; 则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。 
如何才能让sql2不等待或等待指定的时间呢? 我们再运行sql3 
3. select * from t where a=’1’ for update nowait; 则在执行此sql时,直接报资源忙的异常。 
若执行 select * from t where a=’1’ for update wait 6; 则在等待6秒后,报 资源忙的异常。 
如果我们执行sql4 
4. select * from t where a=’1’ for update nowait skip Locked; 则执行sql时,即不等待,也不报资源忙异常。 
现在我们看看执行如下操作将会发生什么呢? 
在窗口1中执行: 
select * from t where rownum<=3 nowait skip Locked; 
在窗口2中执行: 
select * from t where rownum<=6 nowait skip Locked; 
select for update 也就如此了吧,insert、update、delete操作默认加行级锁,其原理和操作与select for update并无两样。 
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。

实例2 
elect * from t for update 会等待行锁释放之后,返回查询结果。 
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果 
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果 
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录

——————————— MySQL —————————————————–

MySQL中select * for update锁表的问题

页级:引擎 BDB。 
表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 
行级:引擎 INNODB , 单独的一行记录加锁 
表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许 
行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。 
页级,表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。 
MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。 
对WRITE,MySQL使用的表锁定方法原理如下: 
如果在表上没有锁,在它上面放一个写锁。 
否则,把锁定请求放在写锁定队列中。 
对READ,MySQL使用的锁定方法原理如下: 
如果在表上没有写锁定,把一个读锁定放在它上面 
否则,把锁请求放在读锁定队列中。 
InnoDB使用行锁定,BDB使用页锁定。对于这两种存储引擎,都可能存在死锁。这是因为,在SQL语句处理期间,InnoDB自动获得行锁定和BDB获得页锁定,而不是在事务启动时获得。

MySQL中select * for update锁表的问题 
由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。 
举个例子: 
假设有个表单products ,里面有id跟name二个栏位,id是主键。 
例1: (明确指定主键,并且有此笔资料,row lock) 
SELECT * FROM products WHERE id=’3’ FOR UPDATE; 
SELECT * FROM products WHERE id=’3’ and type=1 FOR UPDATE;

例2: (明确指定主键,若查无此笔资料,无lock) 
SELECT * FROM products WHERE id=’-1’ FOR UPDATE;

例2: (无主键,table lock) 
SELECT * FROM products WHERE name=’Mouse’ FOR UPDATE;

例3: (主键不明确,table lock) 
SELECT * FROM products WHERE id<>’3’ FOR UPDATE;

例4: (主键不明确,table lock) 
SELECT * FROM products WHERE id LIKE ‘3’ FOR UPDATE;

注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。 
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。

在MySql 5.0中测试确实是这样的 
另外:MyAsim 只支持表级锁,InnerDB支持行级锁 
添加了(行级锁/表级锁)锁的数据不能被其它事务再锁定,也不被其它事务修改(修改、删除) 
是表级锁时,不管是否查询到记录,都会锁定表

关于Oracle中for update的补充说明:

分成两类:加锁范围子句和加锁行为子句

加锁范围子句: 
在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁

加锁行为子句: 
当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。

For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。

那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

MySQL SELECT ... FOR UPDATE

MySQL SELECT ... FOR UPDATE

MySQL  使用 SELECT ... FOR UPDATE 做事务写入前的确认


以 MySQL 的 InnoDB 为例,预设的 Tansaction isolation level 为 REPEATABLE READ,在 SELECT 的读取锁定主要分为两种方式:


SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE


这两种方式在事务 (Transaction) 进行当中 SELECT 到同一个数据表时,都必须等待其它事务数据被提交 (Commit) 后才会执行。而主要的不同在于 LOCK IN SHARE MODE 在有一方事务要 Update 同一个表单时很容易造成死锁 。


简单的说,如果 SELECT 后面若要 UPDATE 同一个表单,最好使用 SELECT ... UPDATE。


举个例子:假设商品表单 products 内有一个存放商品数量的 quantity ,在订单成立之前必须先确定 quantity 商品数量是否足够 (quantity>0) ,然后才把数量更新为 1。


不安全的做法:


SELECT quantity FROM products WHERE id=3; UPDATE products SET quantity = 1 WHERE id=3;


为什么不安全呢?


少量的状况下或许不会有问题,但是大量的数据存取「铁定」会出问题。


如果我们需要在 quantity>0 的情况下才能扣库存,假设程序在第一行 SELECT 读到的 quantity 是 2 ,看起来数字没有错,但是当 MySQL 正准备要 UPDATE 的时候,可能已经有人把库存扣成 0 了,但是程序却浑然不知,将错就错的 UPDATE 下去了。


因此必须透过的事务机制来确保读取及提交的数据都是正确的。


于是我们在 MySQL 就可以这样测试: (注 1)


SET AUTOCOMMIT=0; BEGIN WORK; SELECT quantity FROM products WHERE id=3 FOR UPDATE; ===========================================


此时 products 数据中 id=3 的数据被锁住 (注 3),其它事务必须等待此次事务 提交后才能执行


SELECT * FROM products WHERE id=3 FOR UPDATE (注 2) 如此可以确保 quantity 在别的事务读到的数字是正确的。 ===========================================


UPDATE products SET quantity = ''1'' WHERE id=3 ; COMMIT WORK;


===========================================


提交 (Commit) 写入数据库,products 解锁。


注 1: BEGIN/COMMIT 为事务的起始及结束点,可使用二个以上的 MySQL Command 视窗来交互观察锁定的状况。


注 2: 在事务进行当中,只有 SELECT ... FOR UPDATE 或 LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般 SELECT ... 则不受此影响。


注 3: 由于 InnoDB 预设为 Row-level Lock,数据列的锁定可参考这篇。


注 4: InnoDB 表单尽量不要使用 LOCK TABLES 指令,若情非得已要使用,请先看官方对于 InnoDB 使用 LOCK TABLES 的说明,以免造成系统经常发生死锁。



MySQL SELECT ... FOR UPDATE 的 Row Lock 与 Table Lock


上面介绍过 SELECT ... FOR UPDATE 的用法,不过锁定 (Lock) 的数据是判别就得要注意一下了。由于 InnoDB 预设是 Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行 Row lock (只锁住被选取的数据) ,否则 MySQL 将会执行 Table Lock (将整个数据表单给锁住)。


举个例子:


假设有个表单 products ,里面有 id 跟 name 二个栏位,id 是主键。


例 1: (明确指定主键,并且有此数据,row lock)


SELECT * FROM products WHERE id=''3'' FOR UPDATE;


例 2: (明确指定主键,若查无此数据,无 lock)


SELECT * FROM products WHERE id=''-1'' FOR UPDATE;


例 2: (无主键,table lock)


SELECT * FROM products WHERE name=''Mouse'' FOR UPDATE;


例 3: (主键不明确,table lock)


SELECT * FROM products WHERE id<>''3'' FOR UPDATE;


例 4: (主键不明确,table lock)


SELECT * FROM products WHERE id LIKE ''3'' FOR UPDATE;


注 1: FOR UPDATE 仅适用于 InnoDB,且必须在事务区块 (BEGIN/COMMIT) 中才能生效。


注 2: 要测试锁定的状况,可以利用 MySQL 的 Command Mode ,开二个视窗来做测试。

mysql select for update 的问题

mysql select for update 的问题

打开 2 个 cmd 窗口连接 mysql,都设置 autocommit=0,然后在窗口 1 执行查询语句并加锁:

然后,在窗口 2 执行 update user set score=100 where id=1; 因为前面加了锁这里是 wait:

再回到窗口 1 执行 commit,以便窗口 2 的 update 能执行成功:

窗口 2update 就会成功:

在窗口 2commit:

在窗口 1 执行查询语句发现分数字段并未更新成功,但数据库实际已经更新了。

而且,在窗口 1 再次执行加锁的语句显示等待:

不明白这里怎么还是锁定状态,我上一步已经 commit 了而且窗口 2 也是 update 成功的。在窗口 1 再次执行 commit 发现分数更新了:不明白这里怎么要 commit2 次。

 

mysql SELECT FOR UPDATE语句使用示例

mysql SELECT FOR UPDATE语句使用示例

以MysqL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:
SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE
这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行。而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Update 同一个表单时很容易造成死锁 。
简单的说,如果SELECT 后面若要UPDATE 同一个表单,最好使用SELECT ... UPDATE。
举个例子: 假设商品表单products 内有一个存放商品数量的quantity ,在订单成立之前必须先确定quantity 商品数量是否足够(quantity>0) ,然后才把数量更新为1。
不安全的做法:

复制代码 代码如下:

SELECT quantity FROM products WHERE id=3; UPDATE products SET quantity = 1 WHERE id=3;
 

为什么不安全呢?
少量的状况下或许不会有问题,但是大量的数据存取「铁定」会出问题。
如果我们需要在quantity>0 的情况下才能扣库存,假设程序在第一行SELECT 读到的quantity 是2 ,看起来数字没有错,但是当MysqL 正准备要UPDATE 的时候,可能已经有人把库存扣成0 了,但是程序却浑然不知,将错就错的UPDATE 下去了。
因此必须透过的事务机制来确保读取及提交的数据都是正确的。
于是我们在MysqL 就可以这样测试:
复制代码 代码如下:

SET AUTOCOMMIT=0; BEGIN WORK; SELECT quantity FROM products WHERE id=3 FOR UPDATE; 

此时products 数据中id=3 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
SELECT * FROM products WHERE id=3 FOR UPDATE 如此可以确保quantity 在别的事务读到的数字是正确的。

复制代码 代码如下:

UPDATE products SET quantity = '1' WHERE id=3 ; COMMIT WORK;

提交(Commit)写入数据库,products 解锁。
注1: BEGIN/COMMIT 为事务的起始及结束点,可使用二个以上的MysqL Command 视窗来交互观察锁定的状况。
注2: 在事务进行当中,只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 同一笔数据时会等待其它事务结束后才执行,一般SELECT ... 则不受此影响。
注3: 由于InnoDB 预设为Row-level Lock,数据列的锁定可参考这篇。
注4: InnoDB 表单尽量不要使用LOCK TABLES 指令,若情非得已要使用,请先看官方对于InnoDB 使用LOCK TABLES 的说明,以免造成系统经常发生死锁。

MysqL SELECT ... FOR UPDATE 的Row Lock 与Table Lock
上面介绍过SELECT ... FOR UPDATE 的用法,不过锁定(Lock)的数据是判别就得要注意一下了。由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MysqL 才会执行Row lock (只锁住被选取的数据) ,否则MysqL 将会执行Table Lock (将整个数据表单给锁住)。
举个例子:
假设有个表单products ,里面有id 跟name 二个栏位,id 是主键。
例1: (明确指定主键,并且有此数据,row lock)

复制代码 代码如下:

SELECT * FROM products WHERE id='3' FOR UPDATE;
 

例2: (明确指定主键,若查无此数据,无lock)
复制代码 代码如下:

SELECT * FROM products WHERE id='-1' FOR UPDATE;
 
例2: (无主键,table lock)
复制代码 代码如下:

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
 
例3: (主键不明确,table lock)
复制代码 代码如下:

SELECT * FROM products WHERE id<>'3' FOR UPDATE;
 
例4: (主键不明确,table lock)
复制代码 代码如下:

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
 
注1: FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MysqL 的Command Mode ,开二个视窗来做测试。

复制代码 代码如下:

MysqL update && select
CREATE TABLE `testupdate` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `val` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
update testupdate
set val = val+1
where id = 1 and @value := val+1;
select @value;
 

今天关于我可以在SQL UPDATE内使用内部SELECT吗?的介绍到此结束,谢谢您的阅读,有关mysql --- select ...for update、MySQL SELECT ... FOR UPDATE、mysql select for update 的问题、mysql SELECT FOR UPDATE语句使用示例等更多相关知识的信息可以在本站进行查询。

本文将介绍丢弃结果中包含的现有日期,SQL Server的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于php – 在MySQL中,如何选择结果中包含我测试的每个值的结果?、SQL Server SQL 返回期间内的所有日期、SQL Server SQL学习笔记七函数 数字,日期,类型转换,空值处理,case、sql server 企业管理器 如何在查询结果中 直接修改 单元格 值的知识。

本文目录一览:

丢弃结果中包含的现有日期,SQL Server

丢弃结果中包含的现有日期,SQL Server

在我的数据库中,我有一个Reservation表,它有三列Initial DayLast DayHouse Id

我想计算总天数,而忽略重复的天数,例如:

+-------------+------------+------------+|             | Results    |            |+-------------+------------+------------+|   House Id  | InitialDay |  LastDay   |+-------------+------------+------------+|  1          | 2017-09-18 | 2017-09-20 ||  1          | 2017-09-18 | 2017-09-22 || 19          | 2017-09-18 | 2017-09-22 || 20          | 2017-09-18 | 2017-09-22 |+-------------+------------+------------+

如果您发现HouseId编号为1的包含两行,并且每一行都有日期,但是第一行在第二行的日期间隔中。总的天数应该为5,因为不应将第一天计算在内,因为第二天已经存在这些天数。

发生这种情况的原因是,每个房屋都有两个房间,不同的人可以在同一日期住进该房屋。

我的问题是:我该如何忽略这些情况,而仅计算房屋被占用的真实日期?

答案1

在使用SQL Server 2012或更高版本的系统中,您可以LAG()用来获取上一个最终日期并调整初始日期:

with ReservationAdjusted as (select *,  lag(LastDay) over(partition by HouseID order by InitialDay, LastDay) as PreviousLastfrom Reservation)select HouseId,  sum(case when PreviousLast>LastDay then 0 -- fully contained in the previous reservation    when PreviousLast>=InitialDay then datediff(day,PreviousLast,LastDay) -- overlap    else datediff(day,InitialDay,LastDay)+1 -- no overlap    end) as Daysfrom ReservationAdjustedgroup by HouseId

情况是:

  • 该保留项完全包含在先前的保留项中:我们只需要比较结束日期​​,因为前一行是按获取的InitialDay, LastDay,因此先前的开始日期始终小于或等于当前的开始日期。
  • 当前的预订与之前的预订重叠:在这种情况下,我们调整起点,不加1(已经计算了起始日期),这种情况包括前一个终点等于当前的起点(是一天的重叠) 。
  • 没有重叠:我们只计算差值,然后加1即可计算出第一天的时间。

请注意,我们不需要额外的条件来保留a,HouseID因为默认情况下该LAG()函数NULL在没有上一行时返回,并且与null的比较始终为false。

样本输入和输出:

| HouseId | InitialDay |    LastDay ||---------|------------|------------||       1 | 2017-09-18 | 2017-09-20 ||       1 | 2017-09-18 | 2017-09-22 ||       1 | 2017-09-21 | 2017-09-22 ||      19 | 2017-09-18 | 2017-09-27 ||      19 | 2017-09-24 | 2017-09-26 ||      19 | 2017-09-29 | 2017-09-30 ||      20 | 2017-09-19 | 2017-09-22 ||      20 | 2017-09-22 | 2017-09-26 ||      20 | 2017-09-24 | 2017-09-27 || HouseId | Days ||---------|------||       1 |    5 ||      19 |   12 ||      20 |    9 |

php – 在MySQL中,如何选择结果中包含我测试的每个值的结果?

php – 在MySQL中,如何选择结果中包含我测试的每个值的结果?

查看此sql fiddle,了解我的问题 http://sqlfiddle.com/#!9/cf31d3/1的简化版本

我有2个表 – 聊天消息和聊天收件人,如下所示:

示例ChatMessages数据:

示例ChatRecipients数据:

基本上我只想查询包含一组用户ID的消息 – 例如,仅显示在Bob,Susan和Chelsea之间交换的消息.如果我使用用户ID(1,2,3)启动一个新的聊天窗口,那么获取仅涉及这3个人的消息的最佳方式是什么?

这是我当前查询的简化版本(不会产生正确的结果):

SELECT
  cm.message_id as 'message_id',cm.from_id    as 'from_id',(SELECT u.user_fname as 'fname' from Users u where u.user_id = cm.from_id) as 'firstName',(SELECT u.user_lname as 'lname' from Users u where u.user_id = cm.from_id) as 'lastName',cm.chat_text  as 'chat_text'
FROM
  ChatMessages cm
INNER JOIN
  ChatRecipients cr
ON
  cm.message_id = cr.message_id
INNER JOIN
  Users u
ON
  cm.from_id = u.user_id
WHERE
  cm.from_id in ('1','2','3')
AND
  cr.user_id in ('1','3')

我知道使用“IN”运算符对于这种情况不正确,但我有点卡住了.感谢愿意提供帮助的人!

编辑:

我的示例输出返回包含任何上述用户ID的每一行数据,如下所示:

我的目标是将输出限制为只有我测试的每个用户ID与message_id相关联的消息.例如,如果message_id 32是FROM user_id 7并且TO user_id是11& 3,我想检索那条记录.相反,如果message_id 33是FROM user_id 7并且是user_id(s)11& 4我不想检索该记录.

这里的问题是你的消息必须是:

>来自用户1并且收到2,3,… N.
>来自用户2并由1,… N接收
> ……
>来自用户N并且收到1,… N-1

并且您需要一个能够合理缩放的查询,即,对于每个收件人或类似的东西,没有单个JOIN.

让我们从“从”部分开始.

SELECT m.* FROM ChatMessages AS m
    WHERE from_id IN ($users)

现在我需要知道这些消息有哪些收件人.

SELECT m.* FROM ChatMessages AS m
    JOIN ChatRecipients AS r ON (m.message_id = r.message_id)
    WHERE from_id IN ($users)

收件人可能是好是坏,我对它们的数量感兴趣.所以

SELECT m.*,COUNT(*) AS total,SUM(IF(user_id IN ($users),1,0)) AS good
FROM ChatMessages AS m
    JOIN ChatRecipients AS r ON (m.message_id = r.message_id)
    WHERE from_id IN ($users)
GROUP BY m.message_id;

最后

如果消息在我的[1 … N]个用户之间,则可以接受,这意味着
它有N-1个接收者,其中N-1个很好.

SELECT m.*,SUM(IF(user_id IN ({$users}),0) AS good
FROM ChatMessages AS m
    JOIN ChatRecipients AS r ON (m.message_id = r.message_id)
    WHERE from_id IN ({$users})
GROUP BY m.message_id
HAVING total = good AND good = {$n}

测试

在这种情况下有三个id,我们有$users = 1,3和$n = 2

SELECT m.*,SUM(IF(user_id IN (1,3),0)) AS good
FROM ChatMessages AS m
    JOIN ChatRecipients AS r ON (m.message_id = r.message_id)
    WHERE from_id IN (1,3)
GROUP BY m.message_id
HAVING total = good AND good = 2


message_id  from_id     chat_text
1           2           Message from Susan to Bob and Chelsea
2           3           Message from Chelsea to Bob and Susan
3           1           Message from Bob to Chelsea and Susan

SQL Server SQL 返回期间内的所有日期

SQL Server SQL 返回期间内的所有日期

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!

代码如下:

select rownum as dateIndex,to_date('20090701','yyyy-mm-dd')+ rownum-1 AS DATE_ FROM DUAL CONNECT BY LEVEL >= 1 AND LEVEL <=(TO_DATE('20090731','yyyy-mm-dd')-TO_DATE('20090701','yyyy-mm-dd')+1) 


result:

1 2009/07/01
2 2009/07/02
3 2009/07/03
4 2009/07/04
5 2009/07/05
6 2009/07/06
7 2009/07/07
8 2009/07/08
9 2009/07/09
10 2009/07/10
11 2009/07/11
12 2009/07/12
13 2009/07/13
14 2009/07/14
15 2009/07/15

SQL Server SQL学习笔记七函数 数字,日期,类型转换,空值处理,case

SQL Server SQL学习笔记七函数 数字,日期,类型转换,空值处理,case

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!

数字函数
ABS():求绝对值。
CEILING():舍入到最大整数。
FLOOR():舍入到最小整数。
ROUND():四舍五入 ROUND(A,B)A是要处理的数,B是精确到小数点后第几位
LEN():计算字符串长度
LOWER()、UPPER():转小写、大写
LTRIM():字符串左侧的空格去掉
RTRIM():字符串右侧的空格去掉
SUBSTRING(string,start_position,length) string是待处理字符串,start_position是开始截的个数,length是截取的最大长度

日期函数
GETDATE():取得当前日期时间
DATEADD(datepart,number,date),计算增加后的日期
例:DATEADD(DAY,3,date)计算日期date后3天的日期
DATEADD(MONTH,-8,date)计算日期date前8个月的日期
DATEDIFF(datepart,startdate,enddate):计算两个日期之间的差额。
DATEPART(datepart,date):返回一个日期的特定部分

类型转换函数
CAST(expression AS data_type)
CONVERT(data_type,expression)

空值处理函数 如果查询结果是空,则为第二个参数。如果不为空,则是第一个参数
select isnull(FName,'佚名') as 姓名from T_Employee


CASE函数用法
单值判断,相当于switch case
CASE expression
WHEN value1 THEN returnvalue1
WHEN value2 THEN returnvalue2
WHEN value3 THEN returnvalue3
ELSE defaultreturnvalue
END

sql server 企业管理器 如何在查询结果中 直接修改 单元格 值

sql server 企业管理器 如何在查询结果中 直接修改 单元格 值

sql server 企业管理器 如何在查询结果中 直接修改 单元格 值

描述:我们经常会对查询结果做出修改,如果在程序中,直接用update带条件修改,如果在sql server的企业管理器中,想直接对查询语句的结果进行修改怎么实现呢?是可以实现的。

方法:sql server 2005, 在要查询的表上点右键,--->点击编辑前200行,然后点工具栏上的在显示(sql )

输入图片说明 工具按钮,将显示窗口分为上下两部分,上部分是sql语句,下部分是结果,修改上部分的语句,点(!)运行,【不能按F5执行】,然后下边的显示结果是可以修改的,非只读状态!

关于丢弃结果中包含的现有日期,SQL Server的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于php – 在MySQL中,如何选择结果中包含我测试的每个值的结果?、SQL Server SQL 返回期间内的所有日期、SQL Server SQL学习笔记七函数 数字,日期,类型转换,空值处理,case、sql server 企业管理器 如何在查询结果中 直接修改 单元格 值等相关知识的信息别忘了在本站进行查找喔。

如果您想了解在SQL Server中将NULL转换为空字符串的相关知识,那么本文是一篇不可错过的文章,我们将对sql把null转换为0进行全面详尽的解释,并且为您提供关于asp.net – 在SQL Server中将日期转换为刻度、c# – 将null转换为字符串会导致装箱吗?、c# – 返回json结果并将null转换为空字符串、JavaScript中怎么将null转换为空字符串的有价值的信息。

本文目录一览:

在SQL Server中将NULL转换为空字符串(sql把null转换为0)

在SQL Server中将NULL转换为空字符串(sql把null转换为0)

我正在获取’AltReimMethod’的Null值,我想将其转换为空字符串值。这是查询:

(SELECT rc.name from ReimbursementChoice rc WHERE rc.admin_id = a.admin_id AND rc.choice_id = pe.alt_payment_choice) AS ''AltReimMethod''

我试过了

(SELECT (ISNULL(rc.name,'' '')) from ReimbursementChoice rc WHERE rc.admin_id = a.admin_id AND rc.choice_id = pe.alt_payment_choice) AS ''AltReimMethod''

并且

(SELECT (ISNULL(CONVERT(varchar(50),rc.name),'' '')) from ReimbursementChoice rc WHERE rc.admin_id = a.admin_id AND rc.choice_id = pe.alt_payment_choice) AS ''AltReimMethod''

他们没有显示任何错误,但我什至没有任何结果。

答案1

在查询中应用IsNull,而不在查询中应用isull:

ISNULL((SELECT rc.name from ReimbursementChoice rc WHERE rc.admin_id = a.admin_id AND rc.choice_id = pe.alt_payment_choice),'' '') AS ''AltReimMethod''

asp.net – 在SQL Server中将日期转换为刻度

asp.net – 在SQL Server中将日期转换为刻度

有谁知道如何在sql Server中将DATETIME COLUMN转换为TICKS?

解决方法

如果你试图让t-sql将值转换为可以与.NET中创建的“相同”值进行比较的滴答,那么它将无效. sql Server中的DateTime数据类型的精度大约为.003秒(实际值为四舍五入到.000,.003或.007)或10-3,而.NET中的DateTime数据类型的精度为100纳秒( 10-7).

c# – 将null转换为字符串会导致装箱吗?

c# – 将null转换为字符串会导致装箱吗?

想象一下这样的代码:

var str = (String)null;

它有什么不同于:

String str;

要么:

String str = null;

第一个代码是否会导致空值的装箱,还是在编译时将其解析为字符串?

解决方法

让我们把你的问题拿出来挑选它.

您问题中的代码会导致拳击吗?

不,它不会.

这不是因为3个语句中的任何一个都以不同的方式运行(虽然存在差异,但更多如下),但拳击不是使用字符串时发生的概念.

当您获取值类型并将其包装到对象中时,就会发生拳击.字符串是引用类型,因此永远不会涉及到拳击.

所以拳击出局了,剩下的就是这三个陈述相等吗?

这两个也会这样做:

var str = (String)null;
String str = null;

第三个(虽然你的问题顺序中的第二个)是不同的,因为它只声明str标识符是String类型,它没有专门将它初始化为null.

但是,如果这是一个类的字段声明,这将是相同的,因为在构造对象时所有字段都被初始化为默认值/零,因此无论如何它实际上将被初始化为null.

另一方面,如果这是一个局部变量,那么现在有一个未初始化的变量.从你写var …的事实来看,这在字段方面是非法的,这可能对你的问题更正确.

c# – 返回json结果并将null转换为空字符串

c# – 返回json结果并将null转换为空字符串

我有一个返回json结果的动作,但有些属性为null,我想将它们转换为空字符串.我听说我可以使用DefaultValue(“”),但它仍然返回null而不是空字符串.

行动是:

[HttpGet]
public ActionResult GetResults(string date)
{
    var data= GetData();  // returns List<Foo>
    var json = Json(data,JsonRequestBehavior.AllowGet);
    return json;
}

Foo类是:

public class Foo
{
    public string Bar1;

    [DefaultValue("")]
    public int? Bar2;
}

解决方法

像@Dave A注意到你不能将字符串值赋给int值.

但是有一件事我想警告它,你有没有正确设置DefaultValueHandling属性?在这里查看:Removing Default Values in JSON with the MVC4 Web API

除此之外,我建议您使用表示此Bar2 int属性的字符串属性,并“忽略”它以进行序列化,例如:

[JsonIgnore]
[DefaultValue(0)]
public int? Bar2Int;

public string Bar2
{
   return { Bar2Int.HasValue ? this.Bar2Int.Value.ToString() : String.Empty; }
}

使用此方法更好,您不需要任何默认值属性.

JavaScript中怎么将null转换为空字符串

JavaScript中怎么将null转换为空字符串

javascript是一种广泛使用的编程语言,由于其易学易用受到越来越多的开发者的喜爱。在javascript编程中,null和空字符串(“”)是两个相似但不同的值,许多开发者需要在代码中将null转换为空字符串。在本文中,我们将学习如何在javascript中将null转换为空字符串。

1.使用条件语句

在JavaScript中,可以使用条件语句将null转换为空字符串。条件语句包括if、else if和else。如果变量的值为null,则可以将其转换为空字符串。

let str = null;
if (str === null) {
  str = "";
}
登录后复制

2.使用三元运算符

另一个将null转换为空字符串的方法是使用三元运算符。这种方法可以使代码更加简洁。

立即学习“Java免费学习笔记(深入)”;

let str = null;
str = (str === null) ? "" : str;
登录后复制

3.使用逻辑运算符

在JavaScript中,可以使用逻辑运算符将null转换为空字符串。下面的代码演示了如何使用双竖线(||)操作符将null转换为空字符串。

let str = null;
str = str || "";
登录后复制

4.使用toString()方法

在JavaScript中,null类型没有toString()方法,因此不能直接将其转换为空字符串。但是,当使用toString()方法时,null值将被转换为字符串"null",所以我们可以使用以下代码将其转换为空字符串。

let str = null;
str = str.toString() || "";
登录后复制

总结

在JavaScript编程中,将null转换为空字符串是很常见的任务。可以使用条件语句、三元运算符、逻辑运算符或toString()方法来实现这个目标。这些技巧简单易用,适用于大多数情况。希望本文能够帮助您更好地了解JavaScript编程和null和空字符串之间的联系。

以上就是JavaScript中怎么将null转换为空字符串的详细内容,更多请关注php中文网其它相关文章!

关于在SQL Server中将NULL转换为空字符串sql把null转换为0的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于asp.net – 在SQL Server中将日期转换为刻度、c# – 将null转换为字符串会导致装箱吗?、c# – 返回json结果并将null转换为空字符串、JavaScript中怎么将null转换为空字符串的相关信息,请在本站寻找。

本文将带您了解关于筛选器表达式包含“或”时的.Net Framework DataTable.Select的新内容,同时我们还将为您解释String方法的相关知识,另外,我们还将为您提供关于Action framework - Table PPFTTRIGG、ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)、com.datastax.driver.core.AbstractTableMetadata的实例源码、DataTable.Select方法(String,String)的实用信息。

本文目录一览:

筛选器表达式包含“或”时的.Net Framework DataTable.Select(String)方法(筛选器代码aiag)

筛选器表达式包含“或”时的.Net Framework DataTable.Select(String)方法(筛选器代码aiag)

在.Net Web应用程序中,我在许多地方都使用 公共DataRow [] Select(string filterExpression)
方法。由于最后一刻的更改,例如’和’之类的字符现在是有效输入。我有哪些选项,有没有办法适当地更改filterExpression并仍保留数据表上的Select功能,我可以切换到LINQ吗?

答案1

将表达式文字中的单引号(’)加倍,以将其转义:

不需要在字符串文字中转义双引号(“)。字符串文字由单引号引起来,因此双引号仅需使用标准的C#转义:\”(如果在以@符号开头的逐字字符串中则为“”) )

有关更多信息,请参见此链接。

Action framework - Table PPFTTRIGG

Action framework - Table PPFTTRIGG

Created by Jerry Wang, last modified on May 01, 2014

每次在UI上修改并保存order从而 trigger 了action framework的某个具体的action处理之后(以Action profile ORDER_MESSAGES_WEC的action ORDER_STATUS_CHANGE为例),都会在table PPFTTRIGG里生成一条对应的entry:

 

clipboard1

 

 

 

clipboard2

 

 

 

clipboard3

 

 

 

OS_GUID: 唯一标识每次处理的guid

 

APPLKEY: 在此例子下为order ID

 

APPL_OID: 和APPLKEY是1:1关系

 

APPL_CLS: 5C01EBDE73C0AA4EA0C9B99A85BC49DF,对应APPLCTN的value CRM_ORDER

 

APPLCTN: application name, 在one order framework里为常量CRM_ORDER

 

CONTEXT: action profile name

 

TTYPE: trigger type, 即action name

 

STATUS: 表明该action处理状态: 0 - not processed 1 - successfully processed 2 - incorrectly processed

 

MEDIUM_OID: 唯一标识每一次email sending process

 

MEDIUM_CLS: 37AE970776694BC4E10000009B38F9B7,代表email sending

 

TIMECREATE: action处理的timestamp

 

USERCREATE: trigger action处理的user

 

DISPATCH: action 处理方式. 1 - processing using selection report 3 - immediate processing 4 - Processing when saving document

 

PARTINDEP: 是否和partner相关

 

 

如果想debug 该table的update,可以打开debugger的update debugging:

clipboard4

 

clipboard5

 

在class CA_SF_MAIL_PPF~MAP_SAVE_TO_DATABASE里设断点:

clipboard6

 

在SM13里能看到所有待处理的updating module:

clipboard7

 

clipboard8

本文同步分享在 博客“汪子熙”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)

ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)

本文转自:https://www.cnblogs.com/sntetwt/p/3496477.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
 
namespace Gzcms.Common
{
     public  class  CreateTable
     {
         public  static  DataTable getTable()
         {
             //1.创建 datatable 
             DataTable dt =  new  DataTable( "datatable" ); //可以给表创建一个名字,datatable 
             //2.给表加个列名: 
             dt.Columns.Add( "id" typeof (System.Int32)); //类型是可以变换的,比如System.Int32,System.Double.. 
             dt.Columns.Add( "title" typeof (System.String));
             //3.给表加行,内容: 
             DataRow row = dt.NewRow();
             row[ "id" ] = 1;
             row[ "title" ] =  "标题1" ;
             dt.Rows.Add(row); //这样就可以添加了 
             row = dt.NewRow();
             row[ "id" ] = 2;
             row[ "title" ] =  "标题2" ;
             dt.Rows.Add(row);
             return  dt;
             /*
             //4. 过滤表内容,,查找id为1的信息 
             DataRow[] arr = dt.Select("id=1");//返回的是一个数组 
             //5.将过滤的内容插入到另一个table中 
             DataTable dtnew = dt.Clone();//将表dt里的列信息复制到dtnew里,不是复制数据 
             foreach (DataRow row in arr)
             {
                 dtnew.Rows.Add(row);//把过滤好的信息加入到dtnew里 
             }
             dt.AcceptChanges();//添加好后,要记得刷新一下! 
 
             //6.给表排序 
             dt.DefaultView.Sort = "id desc";
             //7.删除数据 
             dt.Rows.Remove(row);//根据row行信息删除 
             dt.Rows.RemoveAt(index);//根据index索引删除 
             //8.修改dt 的列信息 
             row2[0].BeginEdit();
             row2[0]["status"] = 0;
             row2[0].EndEdit();
              */
         }
 
     }
}

 

com.datastax.driver.core.AbstractTableMetadata的实例源码

com.datastax.driver.core.AbstractTableMetadata的实例源码

项目:hawkular-metrics    文件:DataAccessImpl.java   
@Override
public Observable<ResultSet> createTempTablesIfNotExists(final Set<Long> timestamps) {
    return Observable.fromCallable(() -> {
        Set<String> tables = timestamps.stream()
                .map(this::getTempTableName)
                .collect(Collectors.toSet());

        // Todo This is an IO operation..
        Metadata.getKeyspace(session.getLoggedKeyspace()).getTables().stream()
                .map(AbstractTableMetadata::getName)
                .filter(t -> t.startsWith(TEMP_TABLE_NAME_PROTOTYPE))
                .forEach(tables::remove);

        return tables;
    })

            .flatMapIterable(s -> s)
            .zipwith(Observable.interval(300,TimeUnit.MILLISECONDS),(st,l) -> st)
            .concatMap(this::createTemporaryTable);
}
项目:state-channels    文件:ClusteredLoader.java   
public ClusteredLoader(Mapper<Data> mapper,Class<Data> dataClass,Class<CKey> ckeyClass,String tableName) {
    MappingManager manager = mapper.getManager();
    session = manager.getSession();
    this.mapper = manager.mapper(dataClass);

    String keyspace = mapper.getTableMetadata().getKeyspace().getName();
    MaterializedViewMetadata mv = mapper.getTableMetadata().getKeyspace().getMaterializedView(tableName);
    AbstractTableMetadata tableMetadata = mv == null ? mapper.getTableMetadata().getKeyspace().getTable(tableName) : mv;
    if (tableMetadata == null) {
        throw new IllegalArgumentException("No table or materialized view " + keyspace + "." + tableName + "found");
    }

    List<ColumnMetadata> primaryKey = tableMetadata.getPrimaryKey();
    String pkEq = exceptLast(primaryKey).stream()
        .map(c -> c.getName() + "=?")
        .collect(Collectors.joining(" and "));

    List<ColumnMetadata> clusteringColumns = tableMetadata.getClusteringColumns();

    String orderByDesc = orderBy(clusteringColumns,"DESC");
    String orderByAsc = orderBy(clusteringColumns,"ASC");

    String indexColumn = clusteringColumns.get(clusteringColumns.size() - 1).getName();
    indexAccessor = CassandraUtil.findProperty(dataClass,ckeyClass,indexColumn);

    selectUnbounded = prepare(String.format("select * from %s.%s where " + pkEq + " order by %s limit ?",keyspace,tableName,orderByDesc));
    selectBefore = prepare(String.format("select * from %s.%s where "+pkEq+" and %s < ? order by %s limit ?",indexColumn,orderByDesc));
    selectAfter = prepare(String.format("select * from %s.%s where "+pkEq+" and %s > ? order by %s limit ?",orderByDesc));
    selectBeforeAfter = prepare(String.format("select * from %s.%s where "+pkEq+" and %s < ? and %s > ? order by %s limit ?",orderByDesc));

    selectUnboundedAsc = prepare(String.format("select * from %s.%s where "+pkEq+" order by %s limit ?",orderByAsc));
    selectBeforeAsc = prepare(String.format("select * from %s.%s where "+pkEq+" and %s < ? order by %s limit ?",orderByAsc));
    selectAfterasc = prepare(String.format("select * from %s.%s where "+pkEq+" and %s > ? order by %s limit ?",orderByAsc));
    selectBeforeAfterasc = prepare(String.format("select * from %s.%s where "+pkEq+" and %s < ? and %s > ? order by %s limit ?",orderByAsc));

    selectByIdKey = prepare(String.format("select * from %s.%s where "+pkEq+" and %s=?",indexColumn));
    deleteByIdKey = prepare(String.format("delete from %s.%s where "+pkEq+" and %s=?",indexColumn));
    selectAllById = prepare(String.format("select * from %s.%s where " + pkEq,tableName));
    deleteallById = prepare(String.format("delete from %s.%s where "+pkEq,tableName));
}
项目:calcite    文件:CassandraSchema.java   
/** Get the collation of all clustering key columns.
 *
 * @return A RelCollations representing the collation of all clustering keys
 */
public List<RelFieldCollation> getClusteringOrder(String columnFamily,boolean view) {
  AbstractTableMetadata table;
  if (view) {
    table = getKeyspace().getMaterializedView(columnFamily);
  } else {
    table = getKeyspace().getTable(columnFamily);
  }

  List<ClusteringOrder> clusteringOrder = table.getClusteringOrder();
  List<RelFieldCollation> keyCollations = new ArrayList<RelFieldCollation>();

  int i = 0;
  for (ClusteringOrder order : clusteringOrder) {
    RelFieldCollation.Direction direction;
    switch (order) {
    case DESC:
      direction = RelFieldCollation.Direction.DESCENDING;
      break;
    case ASC:
    default:
      direction = RelFieldCollation.Direction.ASCENDING;
      break;
    }
    keyCollations.add(new RelFieldCollation(i,direction));
    i++;
  }

  return keyCollations;
}

DataTable.Select方法(String,String)

DataTable.Select方法(String,String)

DataTable的Select方法,取得的是个Row数组,若要取其中的值,还需要再次for。

 

private void GetRowsByFilter()
{
    DataTable table = DataSet1.Tables["Orders"];

    string expression = "Date > ''1/1/00''";
    string sortOrder = "CompanyName DESC";
    DataRow[] foundRows;

    foundRows = table.Select(expression, sortOrder);

    for(int i = 0; i < foundRows.Length; i ++)
    {
        Console.WriteLine(foundRows[i][0]);
    }
}

今天的关于筛选器表达式包含“或”时的.Net Framework DataTable.SelectString方法的分享已经结束,谢谢您的关注,如果想了解更多关于Action framework - Table PPFTTRIGG、ASP.NET操作DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等)、com.datastax.driver.core.AbstractTableMetadata的实例源码、DataTable.Select方法(String,String)的相关知识,请在本站进行查询。

本文标签: