【问题标题】:Deleting With join on code igniter MSSQL return an error在代码点火器 MSSQL 上使用连接删除返回错误
【发布时间】:2019-02-07 05:20:36
【问题描述】:

要删除加入我们使用这种格式

DELETE t1,t2 FROM t1
        INNER JOIN
    t2 ON t2.ref = t1.id 
WHERE
    t1.id = 1;

来自www.mysqltutorial.org/mysql-delete-join

按照删除的确切方法,但是当我在自己的版本中实现时,我在要删除的两个表之间的逗号中出现错误。

这就是我所拥有的:

在上图中可以看到我的实现和我得到的错误。

任何想法都值得赞赏

Update

格式相同stackoverflow.com/questions/16481379/how-to-delete-using-inner-join-with-sql-server

【问题讨论】:

  • 您无法从 MSSQL 中的单个删除查询中删除 2 个表。
  • 如果你没有使用撇号
  • @SurajKumar 看到更新我链接了相同的确切链接它不起作用
  • @guradio 你没有遵循我所说的那里建议的想法,因为加入你需要提供别名。您能否发布至少 2-4 行的示例数据和删除后的预期输出?

标签: sql-server codeigniter inner-join sql-delete


【解决方案1】:

SQL Server 只允许在DELETE 语句中从一个表中DELETE

在这种情况下,您试图在单个 DELETE 语句中从两个表中删除记录,这是不允许的。

对于您的情况,您可以简单地编写相同的查询,如下所示。

DELETE FROM lngFileId 
WHERE lngId=5

DELETE FROM tbl_FileOrPath
WHERE lngFileId=5

对于更复杂的场景,你可以尝试如下。

DECLARE @TABLE TABLE 
  ( 
     id INT 
  ) 

INSERT INTO @TABLE 
SELECT t1.ID 
FROM   t1       
WHERE  <YOUR_CONDITION>

DELETE T 
FROM   t1 T 
WHERE  EXISTS (SELECT 1 
               FROM   @TABLE T2 
               WHERE  T2.id = T.id) 

DELETE T 
FROM   t2 T 
WHERE  EXISTS (SELECT 1 
               FROM   @TABLE T2 
               WHERE  T2.id = T.ref) 

另一种情况是当您在启用了ON DELETE CASCADE 的表之间建立Foreign Key 关系时。对于这种情况,您只需从父表中删除,子表记录将自动被删除。

【讨论】:

    【解决方案2】:

    您需要为要删除的表设置别名,如下例所示,w 用于WorkRecord2。当需要内部连接删除或更新语句时,它是必需的。

    DELETE w
    FROM WorkRecord2 w
    INNER JOIN Employee e
      ON EmployeeRun=EmployeeNo
    WHERE Company = '1' AND Date = '2013-05-06'
    

    也只允许删除一个表。在 MySQL 而不是 MSSQL 中允许删除多个表。你可以找到现场演示Here

    下面是带有示例数据的查询。

    create table WorkRecord2 (EmployeeRun int, empWorkNo varchar(10))
    create table Employee (EmployeeNo int, empWorkNo varchar(10), company int, createdDate datetime)
    
    insert into WorkRecord2 Values (1, 'EMW101'),(2, 'EMW102'),(3, 'EMW103'),(4, 'EMW104'),(5, 'EMW105')
    insert into Employee values(1, 'EMW101', 1, GETDATE()),(2, 'EMW103', 2, GETDATE())
    
    Select * from WorkRecord2
    Select * from Employee
    
    -- This will delete with employeeRun 1 and empWorkNo EMW101
    DELETE w
    FROM WorkRecord2 w
    INNER JOIN Employee e
      ON EmployeeRun=EmployeeNo
    WHERE Company = 1 and Cast(createdDate as DATE) = Cast(GETDATE() as DATE)
    
    Select * from WorkRecord2
    Select * from Employee
    

    删除前的表数据如下图。

    EmployeeRun empWorkNo
    ---------------------
    1           EMW101
    2           EMW102
    3           EMW103
    4           EMW104
    5           EMW105
    

    inner join 删除后,表数据如下图。

    EmployeeRun empWorkNo
    ---------------------
    2           EMW102
    3           EMW103
    4           EMW104
    5           EMW105
    

    【讨论】:

    • @guradio 我已经用示例数据添加了解释,以表明它是正确的答案。您需要检查数据是否没有被删除。还要检查记录是否进入内部联接,因为只有在内部联接中匹配的记录才会被删除。
    • 这不满足我的 OP 它只会删除一个表它是正确的答案吗?
    • @guradio 在 MySQL 而不是 MSSQL 中允许删除多个表。
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2012-11-14
    • 2016-03-15
    • 2011-09-27
    • 2016-01-13
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多