Como excluir usando INNER JOIN com SQL Server?

1283

Quero excluir usando INNER JOINno SQL Server 2008 .

Mas eu recebo este erro:

Mensagem 156, Nível 15, Estado 1, Linha 15
Sintaxe incorreta perto da palavra-chave 'INNER'.

Meu código:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
nettoon493
fonte
2
Exemplo C nos documentação mostra como a utilização DELETEde uma junção
Pondlife
1
Exemplo C usa um cursor e um monte de coisas estranhas também
reggaeguitar 27/01
Excluir da tabela1 da tabela1 t1 junção interna tabela2 t2 em t1.id = t2.id; em detalhes youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Respostas:

2241

Você precisa especificar de qual tabela você está excluindo, eis uma versão com um alias:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Taryn
fonte
9
@bluefeet você poderia fornecer a sintaxe correta para o SQL Server para excluir de ambas as tabelas?
Oabarca
44
@ user2070775 No SQL Server, para excluir de 2 tabelas, você precisa usar 2 instruções separadas.
Taryn
8
@ user2070775 no SQL Server, você pode usar transações e pseudo-tabelas, como mostrado na stackoverflow.com/questions/783726/...
Mathieu Rodic
1
@MathieuRodic obrigado por compartilhar. Na minha configuração se eu excluir das 2 mesas separadamente Eu realmente não sei mais quais linhas para apagar a partir do 2º mesa para que isso vai ajudar :)
Verena Haunschmid
2
@ShahryarSaljoughi, que é o alias da tabela WorkRecord2.
Taryn
151

Basta adicionar o nome da tabela entre DELETEe FROMde onde você deseja excluir registros, pois precisamos especificar a tabela a ser excluída. Remova também a ORDER BYcláusula, porque não há nada a pedir ao excluir registros.

Portanto, sua consulta final deve ser assim:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
hims056
fonte
3
Este funciona no SQL Server se você apenas deseja excluir da primeira tabela.
precisa saber é o seguinte
1
@matwonk: Você pode excluir da segunda tabela se usar o nome da segunda tabela. Por exemplo, usando DELETE Employeeexcluirá da tabela de funcionários em vez de WorkRecord2tabela.
hims056
1
@matwonk: Aqui está um exemplo: 1) Excluindo da primeira tabela 2) Excluindo da segunda tabela .
hims056
30

É possível que isso seja útil para você -

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

Ou tente isso -

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)
Devart
fonte
1
Esta é a única resposta que funciona no Sql Server. Basta construir sua consulta como selecionar Id a partir de ... juntar-se ... se juntar etc, em seguida, envolvê-la como uma subconsulta e fazer uma exclusão a partir de (tabela), onde Id em (subconsulta)
Chris Moschini
28

Tente o seguinte:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
Behrouz Bakhtiari
fonte
16

Deveria ser:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
yoginder bagga
fonte
11

Esta versão deve funcionar

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
AustinTX
fonte
11

No SQL Server Management Studio, posso criar facilmente uma SELECTconsulta.

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

Eu posso executá-lo e todos os meus contatos são mostrados.

Agora mude SELECTpara a DELETE:

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

Todos os registros que você viu na SELECTdeclaração serão removidos.

Você pode até criar uma junção interna mais difícil com o mesmo procedimento, por exemplo:

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
frans eilering
fonte
10
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
Dhanraj Mittal
fonte
9

Tente esta consulta:

DELETE WorkRecord2, Employee 
FROM WorkRecord2 
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1' 
AND tbl_name.Date = '2013-05-06';
Todos
fonte
8
Tenho certeza que um DELETE pode especificar apenas uma tabela. Isso não funciona para mim.
Rabino furtivo
3
Eu acredito que você pode especificar várias tabelas para exclusão no mySQL, mas não no SQL Server (que a pergunta faz).
dandev91
7

Outra maneira de usar CTE.

;WITH cte 
     AS (SELECT * 
         FROM   workrecord2 w 
         WHERE  EXISTS (SELECT 1 
                        FROM   employee e 
                        WHERE  employeerun = employeeno 
                               AND company = '1' 
                               AND date = '2013-05-06')) 
DELETE FROM cte 

Nota: Não podemos usar JOINdentro CTEquando você quiser delete.

P ரதீப்
fonte
6

Esta é uma consulta simples para excluir os registros de duas tabelas por vez.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Ady
fonte
2
Esta pergunta é para o SQL Server. Você não pode excluir de duas tabelas em uma instrução no SQL Server. Meu entendimento é que isso pode ser feito no mysql e no MS Access.
Darren Griffith
6

Tente isso, pode ajudar

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
viraj sharma
fonte
7
Qual é a diferença da resposta aceita: stackoverflow.com/questions/16481379/… ?
localidade padrão
3
Esta resposta usa nomeação explícita de tabela em vez de alias, tornando mais fácil para os menos experientes ler / entender o que está acontecendo.
Joshua Burns,
1
@ JosuéBurns: Ainda duplicata exata da minha resposta .
hims056
4

Aqui está a minha versão do SQL Server

DECLARE @ProfileId table(Id bigint)

DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email

DELETE FROM UserProfiles    
WHERE Id = (Select Id FROM @ProfileId)
ozzy432836
fonte
4

Você não especifica as tabelas para CompanyeDate , talvez queira consertar isso.

SQL padrão usando MERGE:

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

A resposta do @Devart também é SQL padrão, embora incompleta, deve se parecer mais com isso:

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

O importante a ser observado sobre o exposto acima é que a exclusão está direcionada a uma única tabela, conforme aplicado no segundo exemplo, exigindo uma subconsulta escalar.

Para mim, as várias respostas de sintaxe proprietárias são mais difíceis de ler e entender. Eu acho que a mentalidade para é melhor descrita na resposta por @frans eilering, ou seja, a pessoa que escreve o código não se importa necessariamente com a pessoa que lerá e manterá o código.

um dia quando
fonte
4

Aqui está o que atualmente uso para excluir ou mesmo atualizar:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
PPJN
fonte