Jak usunąć za pomocą INNER JOIN z SQL Server?

1283

Chcę usunąć stosując INNER JOINw SQL Server 2008 .

Ale pojawia się ten błąd:

Msg 156, poziom 15, stan 1, wiersz 15
Niepoprawna składnia w pobliżu słowa kluczowego „INNER”.

Mój kod:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
nettoon493
źródło
2
Przykład C w dokumentacji pokazuje, jak używać DELETEze złączeniem
Pondlife
1
Przykład C używa również kursora i kilku obcych rzeczy
reggaeguitar
Usuń z tabeli 1 z tabeli 1 t1 łączyć wewnętrznie table2 t2 na t1.id = t2.id; szczegółowo youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Odpowiedzi:

2241

Musisz określić, z której tabeli usuwasz, oto wersja z aliasem:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Taryn
źródło
9
@bluefeet czy możesz podać poprawną składnię dla SQL Server do usuwania z obu tabel?
oabarca
44
@ user2070775 W SQL Server, aby usunąć z 2 tabel, musisz użyć 2 oddzielnych instrukcji.
Taryn
8
@ user2070775 w SQL Server, możesz używać transakcji i pseudo-tabel, jak pokazano na stackoverflow.com/questions/783726/…
Mathieu Rodic
1
@MathieuRodic dzięki za udostępnienie. W moim ustawieniu, jeśli usunę z 2 tabel osobno, nie wiem już, które wiersze usunąć z 2 tabeli, więc to pomoże :)
Verena Haunschmid
2
@ShahryarSaljoughi, który jest aliasem dla tabeli WorkRecord2.
Taryn
151

Wystarczy dodać nazwę tabeli pomiędzy DELETEi FROMskąd chcesz usunąć rekordy, ponieważ musimy określić tabelę do usunięcia. Usuń także ORDER BYklauzulę, ponieważ nie ma nic do zamówienia podczas usuwania rekordów.

Twoje ostatnie zapytanie powinno wyglądać następująco:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
hims056
źródło
3
Ten działa na SQL Server, jeśli zamierzasz usunąć tylko z pierwszej tabeli.
TroySteven,
1
@matwonk: Możesz usunąć z drugiej tabeli, jeśli używasz nazwy drugiej tabeli. Np. Użycie DELETE Employeespowoduje usunięcie z tabeli pracownika zamiast WorkRecord2tabeli.
hims056
1
@matwonk: Oto przykład: 1) Usuwanie z pierwszej tabeli 2) Usuwanie z drugiej tabeli .
hims056
30

Może to być pomocne dla Ciebie -

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

Lub spróbuj tego -

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)
Devart
źródło
1
To jedyna odpowiedź, która działa na serwerze Sql. Po prostu zbuduj zapytanie, np. Wybierz Id z ... dołącz ... dołącz itp., A następnie zawiń je jako podzapytanie i wykonaj usunięcie z (tabeli), w którym Id (podquery)
Chris Moschini
28

Spróbuj tego:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
Behrouz Bakhtiari
źródło
16

Powinno być:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
Joginder Bagga
źródło
11

Ta wersja powinna działać

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
AustinTX
źródło
11

W SQL Server Management Studio mogę łatwo utworzyć SELECTzapytanie.

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

Mogę go wykonać, a wszystkie moje kontakty zostaną wyświetlone.

Teraz zmień SELECTDo DELETE:

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

Wszystkie rekordy, które widziałeś w SELECTwyciągu, zostaną usunięte.

Możesz nawet stworzyć trudniejsze połączenie wewnętrzne za pomocą tej samej procedury, na przykład:

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
frans eilering
źródło
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
źródło
9

Spróbuj tego zapytania:

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';
Ali
źródło
8
Jestem prawie pewien, że DELETE może określić tylko jedną tabelę. To mi nie działa.
Stealth Rabbi
3
Wierzę, że możesz określić wiele tabel do usunięcia w mySQL, ale nie SQL Server (o co pyta pytanie).
dandev91
7

Innym sposobem używania 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 

Uwaga: nie możemy używać JOINwewnątrz, CTEkiedy chcesz delete.

P ரதீப்
źródło
6

Jest to proste zapytanie, aby usunąć rekordy z dwóch tabel jednocześnie.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Ady
źródło
2
To pytanie dotyczy programu SQL Server. Nie można usunąć z dwóch tabel w jednej instrukcji w SQL Server. Rozumiem, że można to zrobić w mysql i MS Access.
Darren Griffith,
6

Spróbuj tego, to może pomóc

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
viraj sharma
źródło
7
Czym różni się od przyjętej odpowiedzi: stackoverflow.com/questions/16481379/... ?
domyślne ustawienia narodowe
3
Ta odpowiedź używa jawnego nazewnictwa tabeli, a nie aliasingu, dzięki czemu osoby mniej doświadczone mogą czytać / łapać to, co się dzieje.
Joshua Burns
1
@JoshuaBurns: Wciąż dokładny duplikat mojej odpowiedzi .
hims056
4

Oto moja wersja 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
źródło
4

Nie określasz tabel dla Companyi Datemożesz to naprawić.

Standardowy SQL przy użyciu MERGE:

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

Odpowiedź @Devart jest również Standard SQL, choć niekompletna, powinna wyglądać mniej więcej tak:

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

Ważną rzeczą, na którą należy zwrócić uwagę w związku z powyższym, jest jasne, że usunięcie jest wymierzone w pojedynczą tabelę, co wymuszono w drugim przykładzie, wymagając skalarnego podzapytania.

Dla mnie różne zastrzeżone odpowiedzi składniowe są trudniejsze do odczytania i zrozumienia. Myślę, że sposób myślenia najlepiej opisać w odpowiedzi eilering @frans, tzn. Osoba pisząca kod niekoniecznie dba o osobę, która będzie czytać i utrzymywać kod.

oneedaywhen
źródło
4

Oto, czego obecnie używam do usuwania, a nawet aktualizacji:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
PPJN
źródło