postgres - uso de inner join mysql




Como excluir usando o INNER JOIN com o SQL Server? (11)

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)

Desejo excluir usando o INNER JOIN no SQL Server 2008 .

Mas eu recebo este erro:

Msg 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'

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

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

Deveria ser:

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

Esta versão deve funcionar

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

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 o JOIN dentro do CTE quando você deseja delete .


Possivelmente isto 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 ....
)

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';

Tente isso, pode ajudar

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

Você não especifica as tabelas para Company e Date , você pode querer corrigir 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 de @Devart é também SQL padrão, embora incompleta, deve ser mais parecida com isto:

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 notar sobre o que foi dito acima é que está claro que a exclusão tem como alvo uma única tabela, conforme forçada 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 é melhor descrita na resposta por @frans eilering, ou seja, a pessoa que escreve o código não necessariamente se preocupa com a pessoa que lerá e manterá o código.


Você precisa especificar de qual tabela você está excluindo, aqui está 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'

 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'






sql-delete