现有2句示例:
delete from goods where name='a'
delete A FROM table_a A inner join DB2.dbo.table_a B on a.col1 = b.col1(col1是PK)第一句的意思是从表goods里面删除字段name值为a的所有记录
第二句是我以前问的,DB1和DB2分别是正式数据库和备份数据库,在要备份的记录移动到DB2以后再在DB1中删除备份记录的语句,如果按第一句的意思来理解的话,意思应该是在2个数据库里面的2个表的联合表里面删除表A的内容,这个inner join出来的联合表应该只是一个临时表啊,这样实际上会不会达到删除正式数据库里面表A里面记录的目的呢?这语句的意思应该怎么来想?另外我想问下,我2个数据库DB1和DB2的结构是完全一样的,DB2就是为了装DB1里面过期被删除的数据,这样有了2个数据库以后,我在给DB1写作业调度的时候,是不是都要用DB1.dbo.table_a的形式来表示每一个表啊?有办法设定作业语句的执行对象么?还有,按照我这样的想法DB2会越来越大,这样在数据多了以后会不会影响到第二句语句的执行速度呢?如果我把DB2也用来装临时数据,比如一个季度的数据,然后一个季度以后把数据移动到DB3,DB2再重新装当前季度需要备份的数据,这样每次执行的时候,DB2最大也只有一个季度的内容,这样做有实际意义么?

解决方案 »

  1.   

    delete A FROM table_a A inner join DB2.dbo.table_a B on a.col1 = b.col1(col1是PK) 删除table_a表的中col1和DB2.dbo.table_a表的col1的记录.
      

  2.   

    那delete from goods where name='a'这句应该怎么理解?
    还有 你LS的意思是:删除table_a表的中col1和DB2.dbo.table_a表的col1的值相等的记录哇?
      

  3.   

    那delete from goods where name='a'这句应该怎么理解?
    就是删除goods表name为a的记录..
    还有 你LS的意思是:删除table_a表的中col1和DB2.dbo.table_a表的col1的值相等的记录哇?
    是的.
      

  4.   

    1) ..inner join出来的联合表并非是一个临时表
    可以理解为 "将FROM table_a A inner join DB2.dbo.table_a B on a.col1 = b.col1里,A表中满足条件的记录删除"
    等效于:
    delete A
    from table_a A
    where exists (select 1
      from DB2.dbo.table_a B 
      where a.col1 = b.col1)2) 如果你的SQL连接是连接到DB1上,那就不用"DB1.dbo.table_a"这样的表现方式3) 这样在数据多了以后会不会影响到第二句语句的执行速度呢?
    应该不会有多严重,因为:(col1是PK)4) 视你的具体应用而言。你的数据量有多大? 历史数据的应用率有多高?
      

  5.   

    第一句的delete from中间是不是可以加一个*号?
      

  6.   

    4L和7L的说法让我有点明白了,那么第二句里面指定从哪个表里面删除记录是从delete A from....看出来的?
    这样的话,第一句的delete from中间省略了什么都没,又怎么理解呢?是不是第一句可以写成:
    delete goods from goods where name='a'?
      

  7.   

    delete a from ta inner join tb b on a.id=b.id功能:
    删除 ta 中 id 存在于 tb 中 id 的记录.
    或者说 ta,tb以 ta.id与 tb.id关联,则删除ta中与tb关联的记录。select a.* from ta inner join tb b on a.id=b.id这句能看懂,那么,这句delete也就能看懂。只不过 delete 语句只能从一个数据表中进行删除(利用触发器,级联删除,可更新视图等除外),即便是用了以上的方式,从形式来说,delete 也只是从一个数据源删除。即:
    delete a from a inner ..
    而不能是
    delete a,b from ...
    而这个数据源可能是表,含触发器的表,可更新视图,带级联关系并指定on delete cascade的表 等(用这样的方式实现 从形式上对一个源进行删除而实际上删除多个表数据)
    而不是你所理解的, ta a innner join tb b 形成临时结果集,删除临时结果集中数据。这只是一种语法表示, 或者说是编译器与执行器的事先约定, 编译器读到这样的语法,就告诉执行器,我要删除ta里的数据了,条件是a.id在b.id里。
      

  8.   

    inner join 只是作为一个条件而已
      

  9.   

    delete from A FROM table_a A inner join DB2.dbo.table_a B on a.col1 = b.col1(col1是PK)