Join returns no results [closed]
-
11-10-2020 - |
Pregunta
In a trigger, I have:
SELECT TOP 1 t.Id
FROM deleted d
INNER JOIN Table t
ON t.Id = d.Id
SELECT TOP 1 t.Id
FROM Table t
WHERE t.Id = (SELECT TOP 1 d.Id FROM deleted d)
Table is a related table that references the trigger's table. Trigger is after Delete
Why does the first return no result but the second does?
Solución 2
The relationship was setting Table's foreign key to null before the trigger was running - so no rows to join to.
I'm not sure why the IN
query worked. I suspect that when I tested it, the delete action was set to no action and the trigger ultimately failed.
Otros consejos
As Aaron Bertrand has pointed out on his comment, the only reason you has no records could be related to the order. But IMHO first query should return one record unless there are no coincidences on the related table.
CREATE TABLE T ( ID INT, F1 CHAR(1), PRIMARY KEY (ID DESC) ); INSERT INTO T VALUES (1,'A'),(2,'B'),(3,'C'),(4,'D'); CREATE TABLE TREF ( ID INT, F1 CHAR(1), PRIMARY KEY (ID DESC) ); INSERT INTO TREF VALUES (1,'A'),(2,'B'),(5,'C'),(6,'D'); CREATE TABLE T1 ( ID INT IDENTITY(1,1) PRIMARY KEY, RES NVARCHAR(MAX) ); GO
8 rows affected
CREATE TRIGGER TRG_T_DELETE ON T AFTER DELETE AS BEGIN INSERT INTO T1 SELECT 'COUNT: ' + CAST(COUNT(*) AS VARCHAR(10)) FROM deleted; INSERT INTO T1 SELECT 'deleted: ' + (SELECT * FROM deleted WHERE ID = d.ID FOR XML RAW) FROM deleted d; INSERT INTO T1 SELECT TOP 1 'join: ' + (SELECT * FROM TREF WHERE ID = T.ID FOR XML RAW) FROM deleted d JOIN TREF T ON T.ID = D.ID; INSERT INTO T1 SELECT TOP 1 'IN: ' + (SELECT * FROM TREF WHERE ID = T.ID FOR XML RAW) FROM TREF T WHERE T.ID = (SELECT TOP 1 ID FROM deleted ORDER BY ID DESC) END GO
✓
DELETE FROM T WHERE ID >= 2; SELECT * FROM T1; GO
ID | RES -: | :---------------------------- 1 | COUNT: 3 2 | deleted: <row ID="2" F1="B"/> 3 | deleted: <row ID="3" F1="C"/> 4 | deleted: <row ID="4" F1="D"/> 5 | join: <row ID="2" F1="B"/>
dbfiddle here
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange