Link to home
Start Free TrialLog in
Avatar of Carla Romere
Carla RomereFlag for United States of America

asked on

T-SQL Query Explanation

I am writing a query to archive some data in a few of our huge tables in our ERP system.
I made a mistake in my delete statement and would like for someone to explain to me exactly how the delete query ran at all. Here is the full query:
/* IC BIN MOVEMENTS */

CREATE TABLE #BINMOVEMENTS(
	[OLD_GEM_DBKEY] [int] NOT NULL, --WILL BE ORIGINAL GEM_DBKEY FROM IC_BIN_MOVEMENTS
	[COMPANY_CODE] [varchar](10) NOT NULL,
	[WAREHOUSE] [varchar](2) NOT NULL,
	[PART_CODE] [varchar](15) NULL,
	[BIN_LOCATION] [varchar](15) NOT NULL,
	[MH_NUMBER] [int] NOT NULL,
	[DOCUMENT_NUMBER] [varchar](13) NOT NULL,
	[DOCUMENT_LINE] [varchar](9) NULL,
	[DOCUMENT_SEQUENCE] [smallint] NOT NULL,
	[UNIT_OF_MEASURE] [varchar](4) NULL,
	[SOURCE_MODULE] [varchar](2) NULL,
	[TRANSACTION_TYPE] [varchar](2) NULL,
	[FACTORY] [varchar](2) NOT NULL,
	[WAREHOUSE_ZONE] [varchar](6) NOT NULL,
	[MOVEMENT_DATE] [datetime] NULL,
	[SYSTEM_DATE] [datetime] NOT NULL,
	[USERNAME] [varchar](12) NOT NULL,
	[SYS_CALLING_FUNCTION] [varchar](15) NOT NULL,
	[IC_STATUS_CODE] [varchar](8) NOT NULL,
	[IC_LOT_NUMBER] [varchar](15) NOT NULL,
	[IC_LOT_SEQUENCE] [int] NOT NULL,
	[IC_QUANTITY_FIELD] [varchar](30) NOT NULL,
	[IC_MOVE_QUANTITY] [numeric](20, 6) NOT NULL,
	[IC_PRODUCT_UOM_TYPE] [varchar](1) NOT NULL,
	[MOVEMENT_CODE] [varchar](6) NULL,
	[TRANSACTION_DESCRIPTION] [varchar](30) NULL,
	[PERIOD] [smallint] NOT NULL,
	[YEAR] [smallint] NOT NULL,
	[GEM_TRANSACTION_ID] [varchar](64) NULL
)

INSERT INTO #BINMOVEMENTS (
	OLD_GEM_DBKEY,
	COMPANY_CODE,
	WAREHOUSE,
	PART_CODE,
	BIN_LOCATION,
	MH_NUMBER,
	DOCUMENT_NUMBER,
	DOCUMENT_LINE,
	DOCUMENT_SEQUENCE,
	UNIT_OF_MEASURE,
	SOURCE_MODULE,
	TRANSACTION_TYPE,
	FACTORY,
	WAREHOUSE_ZONE,
	MOVEMENT_DATE,
	SYSTEM_DATE,
	USERNAME,
	SYS_CALLING_FUNCTION,
	IC_STATUS_CODE,
	IC_LOT_NUMBER,
	IC_LOT_SEQUENCE,
	IC_QUANTITY_FIELD,
	IC_MOVE_QUANTITY,
	IC_PRODUCT_UOM_TYPE,
	MOVEMENT_CODE,
	TRANSACTION_DESCRIPTION,
	PERIOD,
	[YEAR],
	GEM_TRANSACTION_ID
) 
(
SELECT C.[GEM_DBKEY]
	  ,C.[COMPANY_CODE]
      ,C.[WAREHOUSE]
      ,C.[PART_CODE]
      ,C.[BIN_LOCATION]
      ,C.[MH_NUMBER]
      ,C.[DOCUMENT_NUMBER]
      ,C.[DOCUMENT_LINE]
      ,C.[DOCUMENT_SEQUENCE]
      ,C.[UNIT_OF_MEASURE]
      ,C.[SOURCE_MODULE]
      ,C.[TRANSACTION_TYPE]
      ,C.[FACTORY]
      ,C.[WAREHOUSE_ZONE]
      ,C.[MOVEMENT_DATE]
      ,C.[SYSTEM_DATE]
      ,C.[USERNAME]
      ,C.[SYS_CALLING_FUNCTION]
      ,C.[IC_STATUS_CODE]
      ,C.[IC_LOT_NUMBER]
      ,C.[IC_LOT_SEQUENCE]
      ,C.[IC_QUANTITY_FIELD]
      ,C.[IC_MOVE_QUANTITY]
      ,C.[IC_PRODUCT_UOM_TYPE]
      ,C.[MOVEMENT_CODE]
      ,C.[TRANSACTION_DESCRIPTION]
      ,C.[PERIOD]
      ,C.[YEAR]
      ,C.[GEM_TRANSACTION_ID]
  FROM [fin_prod].[dbo].[IC_BIN_MOVEMENTS] C
  INNER JOIN DC_LICENSE_PLATE_LINES L
  ON C.COMPANY_CODE = L.COMPANY_CODE
  AND C.PART_CODE=L.PART_CODE
  AND C.IC_LOT_NUMBER = L.IC_LOT_NUMBER
  RIGHT OUTER JOIN DC_LICENSE_PLATES P
  ON P.COMPANY_CODE = L.COMPANY_CODE
  AND P.DC_LICENSE_PLATE_ID = L.DC_LICENSE_PLATE_ID
  WHERE MOVEMENT_DATE < GETDATE()-365
  AND P.DC_LICENSE_PLATE_STATUS IN('INACTIVE','SHIPPED')
  AND C.GEM_DBKEY IS NOT NULL
)

INSERT INTO [fin_prod].[dbo].[AER_IC_BIN_MOVEMENTS_ARC]
           ([COMPANY_CODE]
           ,[WAREHOUSE]
           ,[PART_CODE]
           ,[BIN_LOCATION]
           ,[MH_NUMBER]
           ,[DOCUMENT_NUMBER]
           ,[DOCUMENT_LINE]
           ,[DOCUMENT_SEQUENCE]
           ,[UNIT_OF_MEASURE]
           ,[SOURCE_MODULE]
           ,[TRANSACTION_TYPE]
           ,[FACTORY]
           ,[WAREHOUSE_ZONE]
           ,[MOVEMENT_DATE]
           ,[SYSTEM_DATE]
           ,[USERNAME]
           ,[SYS_CALLING_FUNCTION]
           ,[IC_STATUS_CODE]
           ,[IC_LOT_NUMBER]
           ,[IC_LOT_SEQUENCE]
           ,[IC_QUANTITY_FIELD]
           ,[IC_MOVE_QUANTITY]
           ,[IC_PRODUCT_UOM_TYPE]
           ,[MOVEMENT_CODE]
           ,[TRANSACTION_DESCRIPTION]
           ,[PERIOD]
           ,[YEAR]
           ,[GEM_TRANSACTION_ID]
           ,[OLD_GEM_DBKEY])

(SELECT [COMPANY_CODE]
           ,[WAREHOUSE]
           ,[PART_CODE]
           ,[BIN_LOCATION]
           ,[MH_NUMBER]
           ,[DOCUMENT_NUMBER]
           ,[DOCUMENT_LINE]
           ,[DOCUMENT_SEQUENCE]
           ,[UNIT_OF_MEASURE]
           ,[SOURCE_MODULE]
           ,[TRANSACTION_TYPE]
           ,[FACTORY]
           ,[WAREHOUSE_ZONE]
           ,[MOVEMENT_DATE]
           ,[SYSTEM_DATE]
           ,[USERNAME]
           ,[SYS_CALLING_FUNCTION]
           ,[IC_STATUS_CODE]
           ,[IC_LOT_NUMBER]
           ,[IC_LOT_SEQUENCE]
           ,[IC_QUANTITY_FIELD]
           ,[IC_MOVE_QUANTITY]
           ,[IC_PRODUCT_UOM_TYPE]
           ,[MOVEMENT_CODE]
           ,[TRANSACTION_DESCRIPTION]
           ,[PERIOD]
           ,[YEAR]
           ,[GEM_TRANSACTION_ID]
           ,[OLD_GEM_DBKEY]
FROM #BINMOVEMENTS)

DELETE FROM dbo.IC_BIN_MOVEMENTS
WHERE GEM_DBKEY IN(SELECT GEM_DBKEY FROM #BINMOVEMENTS)

DROP TABLE #BINMOVEMENTS

Open in new window


In the delete statement's subquery, I had the wrong field selected and the field I put in there doesn't exist. In (SELECT GEM_DBKEY FROM #BINMOVEMENTS) the field GEM_DBKEY should have been OLD_GEM_DBKEY. When I run that subquery select statement, I get the following error.

 /*------------------------
SELECT GEM_DBKEY FROM #BINMOVEMENTS
------------------------*/
Msg 207, Level 16, State 1, Line 1
Invalid column name 'GEM_DBKEY'.

I would expect to get this error if the field isn't found. However, when I ran the delete statement above, it deleted EVERY RECORD in the IC_BIN_MOVEMENTS table. I am hoping someone could explain that to me because it is escaping me now. We are using APEX SQL to try to get the data restored. But it will take a while to restore 22m rows instead of the 5.5m that *should* have been deleted. I'm just trying to understand WHY it deleted anything.
Avatar of Jim Horn
Jim Horn
Flag of United States of America image

<Wild guess>
Any change that only the DELETE FROM dbo.IC_BIN_MOVEMENTS line was highlighted when it was executed?
If a selection is made and the Execute button is hit, it executes only the selection.
Avatar of Carla Romere

ASKER

No, I made absolutely sure that both rows were highlighted. I just did not catch that I hadn't updated the field name in the subquery.
Try that on a new query window, sql server wont drop the actual table definition even if you delete them manually.
check my blog here
http://sequelserver.blogspot.ca/2013/04/did-drop-table-temp-actually-deletes.html
I haven't run the drop (temp) table statement. I ONLY ran the delete statement by itself (after running everything above the delete statement - one statement at a time). The temp table is still there because I haven't closed that session yet. I'm just curious why EVERY row was deleted in the IC_BIN_MOVEMENTS table when the select query for the delete referenced a field that didn't exist.
if you are using APEX , then why don't you find the statement that ran the delete
We are still pulling the logs. I just thought there might be an error in my syntax or something and wondered if anyone could tell me.
I cannot think of any cases how your query can run ?
ASKER CERTIFIED SOLUTION
Avatar of Scott Pletcher
Scott Pletcher
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Okay that makes perfect sense and was exactly what I wanted to find out. Thank you so much for explaining that to me!
Nice catch Scott.  Missed that one.