No MySQL você pode usar a sintaxe
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Como faço a mesma coisa no SQL Server?
No MySQL você pode usar a sintaxe
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Como faço a mesma coisa no SQL Server?
Respostas:
Você pode tirar proveito da pseudotabela "excluída" neste exemplo. Algo como:
begin transaction;
declare @deletedIds table ( id int );
delete from t1
output deleted.id into @deletedIds
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
inner join table3 as t3
on t3.id = t2.id;
delete from t2
from table2 as t2
inner join @deletedIds as d
on d.id = t2.id;
delete from t3
from table3 as t3 ...
commit transaction;
Obviamente, você pode fazer uma 'saída excluída'. na segunda, exclua também, se precisar de algo para se juntar à terceira mesa.
Como uma nota lateral, você também pode inserir. * Em uma instrução de inserção e ambos inseridos. * E deletados. * Em uma instrução de atualização.
EDIT: Além disso, você considerou adicionar um gatilho na tabela 1 para excluir da tabela 2 + 3? Você estará dentro de uma transação implícita e também terá as pseudotabelas "inseridas " e "excluídas " disponíveis.
Você sempre pode configurar exclusões em cascata nas relações das tabelas.
Você pode encapsular as várias exclusões em um procedimento armazenado.
Você pode usar uma transação para garantir uma unidade de trabalho.
Você pode usar a sintaxe JOIN na cláusula FROM em DELETE no SQL Server, mas ainda assim exclui apenas da primeira tabela e sua extensão Transact-SQL proprietária, que é alternativa à subconsulta.
Do exemplo aqui :
-- Transact-SQL extension
DELETE
FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN
Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
Exemplo para excluir alguns registros da tabela mestre e os registros correspondentes de duas tabelas de detalhes:
BEGIN TRAN
-- create temporary table for deleted IDs
CREATE TABLE #DeleteIds (
Id INT NOT NULL PRIMARY KEY
)
-- save IDs of master table records (you want to delete) to temporary table
INSERT INTO #DeleteIds(Id)
SELECT DISTINCT mt.MasterTableId
FROM MasterTable mt
INNER JOIN ...
WHERE ...
-- delete from first detail table using join syntax
DELETE d
FROM DetailTable_1 D
INNER JOIN #DeleteIds X
ON D.MasterTableId = X.Id
-- delete from second detail table using IN clause
DELETE FROM DetailTable_2
WHERE MasterTableId IN (
SELECT X.Id
FROM #DeleteIds X
)
-- and finally delete from master table
DELETE d
FROM MasterTable D
INNER JOIN #DeleteIds X
ON D.MasterTableId = X.Id
-- do not forget to drop the temp table
DROP TABLE #DeleteIds
COMMIT
SELECT INTO #DeleteIds
vez de CREATE TABLE 'DeleteIds
seguido por INSERT INTO 'DeleteIds...
?
Basta saber .. isso é realmente possível no MySQL? ele vai deletar t1 e t2? ou eu apenas entendi mal a pergunta.
Mas se você apenas deseja excluir a tabela1 com várias condições de junção, apenas não crie um alias para a tabela que deseja excluir
isto:
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
deve ser escrito assim para funcionar em MSSQL:
DELETE table1
FROM table1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
para contrastar como os outros dois RDBMS comuns fazem uma operação de exclusão:
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
Basicamente, não, você precisa fazer três instruções delete em uma transação, primeiro os filhos e depois os pais. Configurar exclusões em cascata é uma boa ideia se isso não for uma coisa única e sua existência não conflitar com qualquer configuração de acionador existente.
No servidor SQL, não há como excluir várias tabelas usando join. Então você tem que deletar do filho antes de deletar o pai do formulário.
Esta é uma forma alternativa de excluir registros sem deixar órfãos.
Declare @user Table (keyValue int, someString varchar (10)) inserir em @user valores (1, '1 valor') inserir em @user valores (2, '2 valor') inserir em @user valores (3, '3 valor') Declare @password Table (keyValue int, details varchar (10)) inserir em @password valores (1, '1 senha') inserir em @password valores (2, '2 senha') inserir em @password valores (3, '3 senha') --antes da exclusão selecione * em @password a inner join @user b em a.keyvalue = b.keyvalue selecione * em #deletedID de @user onde keyvalue = 1 - funciona como o exemplo de saída delete @user onde keyvalue = 1 delete @password onde keyvalue in (selecione keyvalue em #deletedid) --Após a exclusão-- selecione * em @password a inner join @user b em a.keyvalue = b.keyvalue
Tudo foi apontado. Basta usar DELETE ON CASCADE
no pai table
ou excluir do child-table
para parent
.
Como Aaron já apontou, você pode definir o comportamento de exclusão para CASCADE e isso excluirá os registros filhos quando um registro pai for excluído. A menos que você queira que algum outro tipo de mágica aconteça (nesse caso, os pontos 2, 3 da resposta de Aaron seriam úteis), não vejo por que você precisaria excluir com junções internas.
Para desenvolver a resposta de John Gibb, para excluir um conjunto de dados em duas tabelas com uma relação FK:
--*** To delete from tblMain which JOINs to (has a FK of) tblReferredTo's PK
-- i.e. ON tblMain.Refer_FK = tblReferredTo.ID
--*** !!! If you're CERTAIN that no other rows anywhere also refer to the
-- specific rows in tblReferredTo !!!
BEGIN TRAN;
--*** Keep the ID's from tblReferredTo when we DELETE from tblMain
DECLARE @tblDeletedRefs TABLE ( ID INT );
--*** DELETE from the referring table first
DELETE FROM tblMain
OUTPUT DELETED.Refer_FK INTO @tblDeletedRefs -- doesn't matter that this isn't DISTINCT, the following DELETE still works.
WHERE ..... -- be careful if filtering, what if other rows
-- in tblMain (or elsewhere) also point to the tblReferredTo rows?
--*** Now we can remove the referred to rows, even though tblMain no longer refers to them.
DELETE tblReferredTo
FROM tblReferredTo INNER JOIN @tblDeletedRefs Removed
ON tblReferredTo.ID = Removed.ID;
COMMIT TRAN;
DELETE TABLE1 LIN
FROM TABLE1 LIN
INNER JOIN TABLE2 LCS ON CONDITION
WHERE CONDITION
$ sql = "DELETE FROM basic_tbl
, education_tbl
,
personal_tbl
, address_tbl
, department_tbl
UTILIZAÇÃO
basic_tbl
, education_tbl
,
personal_tbl
, address_tbl
, department_tbl
ONDE
b_id
= e_id
= p_id
= a_id
= d_id
=" $ id. ".' "; $ rs = mysqli_query ($ con, $ sql);