Insert into Linked table in access without the primary key - ms-access
Im trying to insert into a linked SQL table in access 2007, below is my query
INSERT INTO tblProducts ( ProductPrefix, ProductCode, ProductDescription, MadeFrom, MadeFromDescription, SamFamilySort1, SamFamilySort2, SamFamilySort3, SamFamilySort4, SamFamilySort5, Grade, Length, Thickness, fWidth, Factor, CubicMtrs, CubicMtrsFull, [Weight(T)], DrawingFilepath, EFACSProductGrouping, BatchSize, PackSize, Density, createdby, createddate, ProductType, customer, DimA, DimB, DimC, DimD, DimE, DimF, DimG, DimH, DimI, DimJ, DimK, DimL, DimM, DimN, DimO, DimP, DimQ, DimR, DimS, DimT, DimU, DimV, DimW, DimX, DimY, DimZ, TolA, TolB, TolC, TolD, TolE, TolF, TolG, TolH, TolI, TolJ, TolK, TolL, TolM, TolN, TolO, TolP, TolQ, TolR, TolS, TolT, TolU, TolV, TolW, TolX, TolY, TolZ, Dimension, Main, Saws, Moulders, PaintLines, XCut, DET, Wrapper, Blocks, HingeRecess, reorderpolicy, machinedaway, UseOtherM3XC, UseOtherM3MS, ShrinkWrap, ShrinkWrapPackSize, SW, samtype1, vtype1, vtype2, profile, productchamp, UOM, SAMPartGrp, PostingClass, ProductID )
SELECT DISTINCT tblProducts.ProductPrefix, tblProducts.ProductCode, tblProducts.ProductDescription, tblProducts.MadeFrom, tblProducts.MadeFromDescription, tblProducts.SamFamilySort1, tblProducts.SamFamilySort2, tblProducts.SamFamilySort3, tblProducts.SamFamilySort4, tblProducts.SamFamilySort5, tblProducts.Grade, tblProducts.Length, tblProducts.Thickness, tblProducts.fWidth, tblProducts.Factor, tblProducts.CubicMtrs, tblProducts.CubicMtrsFull, tblProducts.[Weight(T)], tblProducts.DrawingFilepath, tblProducts.EFACSProductGrouping, tblProducts.BatchSize, tblProducts.PackSize, tblProducts.Density, tblProducts.createdby, Date() AS Expr1, tblProducts.ProductType, tblProducts.customer, tblProducts.DimA, tblProducts.DimB, tblProducts.DimC, tblProducts.DimD, tblProducts.DimE, tblProducts.DimF, tblProducts.DimG, tblProducts.DimH, tblProducts.DimI, tblProducts.DimJ, tblProducts.DimK, tblProducts.DimL, tblProducts.DimM, tblProducts.DimN, tblProducts.DimO, tblProducts.DimP, tblProducts.DimQ, tblProducts.DimR, tblProducts.DimS, tblProducts.DimT, tblProducts.DimU, tblProducts.DimV, tblProducts.DimW, tblProducts.DimX, tblProducts.DimY, tblProducts.DimZ, tblProducts.TolA, tblProducts.TolB, tblProducts.TolC, tblProducts.TolD, tblProducts.TolE, tblProducts.TolF, tblProducts.TolG, tblProducts.TolH, tblProducts.TolI, tblProducts.TolJ, tblProducts.TolK, tblProducts.TolL, tblProducts.TolM, tblProducts.TolN, tblProducts.TolO, tblProducts.TolP, tblProducts.TolQ, tblProducts.TolR, tblProducts.TolS, tblProducts.TolT, tblProducts.TolU, tblProducts.TolV, tblProducts.TolW, tblProducts.TolX, tblProducts.TolY, tblProducts.TolZ, tblProducts.Dimension, tblProducts.Main, tblProducts.Saws, tblProducts.Moulders, tblProducts.PaintLines, tblProducts.XCut, tblProducts.DET, tblProducts.Wrapper, tblProducts.Blocks, tblProducts.HingeRecess, tblProducts.reorderpolicy, tblProducts.machinedaway, tblProducts.useotherm3XC, tblProducts.useotherm3MS, tblProducts.ShrinkWrap, tblProducts.ShrinkWrapPackSize, tblProducts.SW, tblProducts.samtype1, tblProducts.vtype1, tblProducts.vtype2, tblProducts.profile, tblProducts.productchamp, tblProducts.UOM, tblProducts.SAMPartGrp, tblProducts.PostingClass, tblProducts.ProductID
FROM tblProducts
This works fine and uploads all records in the table with new keys if i want to (I dont). I want to only recreate one product ive tried added the below
WHERE (((tblProducts.ProductID)=[tests]));
Where tests is a popupbox for User entry
i get an error below
My primary key in the table is called [ProductID]. It is possible to add a WHERE [ProductID] = 1234 in this query somehow?
Notice that the very last item in the column list of the INSERT INTO clause is ProductID. So, you are trying to insert a new row with an existing Primary Key value, and that won't work. As a simplified example,
INSERT INTO tblProducts (ProductDescription, ProductID)
SELECT tblProducts.ProductDescription, tblProducts.ProductID
FROM tblProducts
WHERE tblProducts.ProductID=1
will fail with a primary key violation. You need to remove ProductID from both the INSERT INTO and SELECT clauses, and only use it in the WHERE clause:
INSERT INTO tblProducts (ProductDescription)
SELECT tblProducts.ProductDescription
FROM tblProducts
WHERE tblProducts.ProductID=1
Related
SQL Merge Statement Check Constraint Error
I have the following code table A has a check constraint on column Denial. CREATE TABLE Table a ( [ID] int IDENTITY(1,1) NOT NULL , [EntityID] int , Denial nVarchar(20) CONSTRAINT Chk_Denial CHECK (Denial IN ('Y', 'N')), ) Merge statement MERGE INTO Table a WITH (HOLDLOCK) AS tgt USING (SELECT DISTINCT JSON_VALUE(DocumentJSON, '$.EntityID') AS EntityID, JSON_VALUE(DocumentJSON, '$.Denial') AS Denial FROM Table1 bd INNER JOIN table2 bf ON bf.FileUID = bd.FileUID WHERE bf.Type = 'Payment') AS src ON tgt.[ID] = src.[ID] WHEN MATCHED )) THEN UPDATE SET tgt.ID = src.ID, tgt.EntityID = src.EntityID, tgt.Denial = src.Denial, WHEN NOT MATCHED BY TARGET THEN INSERT (ID, EntityID, Denial) VALUES (src.ID, src.EntityID, src.Denial) THEN DELETE I get this error when running my MERGE statement: Error Message Msg 547, Level 16, State 0, Procedure storproctest1, Line 40 [Batch Start Line 0] The MERGE statement conflicted with the CHECK constraint "Chk_Column". The conflict occurred in the database "Test", table "Table1", and column 'Denial'. The statement has been terminated. This is due to the source files having "Yes" and "No" instead of 'Y' and 'N'. Hence, I'm getting the above error. How can I use a Case statement in merge statement to handle the above Check constraints error? or Any alternative solutions.
You can turn Yes to Y and No to N before merging your data. That would belong to the using clause of the merge query: USING ( SELECT Distinct JSON_VALUE(DocumentJSON, '$.EntityID') AS EntityID, CASE JSON_VALUE(DocumentJSON, '$.Denial') WHEN 'Yes' THEN 'Y' WHEN 'No' THEN 'N' ELSE JSON_VALUE(DocumentJSON, '$.Denial') END AS Denial FROM Table1 bd INNER JOIN table2 bf ON bf.FileUID = bd.FileUID WHERE bf.Type = 'Payment' ) AS src The case expression translates Y and N values, and leaves other values untouched. Since this applies to the source dataset, the whole rest of the query benefits (ie both the update and insert branches).
Report the line manager of your line manager where they have a Manager flag (loops)
CREATE TABLE `empTest` ( `keysearch` INT(8) NOT NULL, `flg_manager` INT(1) NOT NULL, `fk_manager` INT(8) NOT NULL, PRIMARY KEY (`keysearch`) ) INSERT INTO `empTest` (`keysearch`, `fk_manager`, `flg_manager`) VALUES ('5407', '5866', 0); INSERT INTO `empTest` (`keysearch`, `fk_manager`, `flg_manager`) VALUES ('5866', '0679', 0); INSERT INTO `empTest` (`keysearch`, `fk_manager`, `flg_manager`) VALUES ('0679', '9177', 1); INSERT INTO `empTest` (`keysearch`, `fk_manager`, `flg_manager`) VALUES ('9177', '0011', 1); In the example data above there are 3 users (4th being the last line manager). I would like to be able to select the "1st keysearch where they have the flg_manager set as 1" as AuthManager (indicating they are an Authorising manager) The query result I am looking to achieve is: Keysearch,AuthManager 5407,0679 5866,0679 0679,9177 I am thinking it needs to be a loop but I really don't know where to start. I understand I need to use the middle employee as a Join to be able to see from employee 5407 to employee 0679. Annoyingly in this example there is only one employee to 'jump' but I need to be able to account for up to 8 jumps. Completely Wrong - but I'm at a complete loss... SELECT e.keysearch, #manager AS manager FROM emptest e, emptest m1, emptest m2 WHERE #manager = CASE WHEN ( SELECT e.fk_manager FROM e WHERE e.fk_manager = m1.keysearch AND m1.flg_manager = 1) Else When... Will I need to do lots of Case loops? Any Suggestions? Running MariaDB 10.3.
MySQL Slow query with multiple joins and subqueries
I have 3 tables: Pi - images Pidl - images dl log => Pidl Pirl - images resize log => Pidl Basically an image is downloaded and a log record is created in Pidl. After that, it's resized and a record is created in Pirl. Said record being connected to the Pidl record. I am writing a query as to find which images need to be resized and it basically queries Pidl. The algo I've devised is simple: for each Image in Pi { pidlA=newest_pidl(Image); if(pidlA.status == success) { pirlA=newest_pirl(Image); if(pirlA.pidl.hash != pidlA.hash) { go; } else if(pirlA.status != success){ failed_attempts = failed_pirl_count(pirlA,newest_succesful_pirl(Image)) decide based on pirlA.time and failed_attempts if go or not } else { dont go; } } else { dont go; } } And now my query(altough is not yet finished, the failed attempts part is missing, but it's already too slow, so first I'd like to fix that). SELECT pidl1A.pidl_id FROM Pidl as pidl1A LEFT JOIN Pidl as pidl2A ON ( pidl1A.pidl_pi_id = pidl2A.pidl_pi_id AND pidl2A.pidl_status = 1 AND (pidl2A.pidl_time > pidl1A.pidl_time OR (pidl2A.pidl_id > pidl1A.pidl_id and pidl1A.pidl_time=pidl2A.pidl_time) ) ) LEFT JOIN ( #newest pirl subquery# SELECT pidl1B.pidl_pi_id as sub_pi_id, pidl1B.pidl_hash as sub_pidl_hash, pirl1B.pirl_id as sub_pirl_id, pirl1B.pirl_status as sub_pirl_status FROM Pirl as pirl1B INNER JOIN Pidl as pidl1B ON (pirl1B.pirl_pidl_id = pidl1B.pidl_id) LEFT JOIN ( SELECT pidl2B.pidl_pi_id as sub_pi_id, pirl2B.pirl_id as sub_pirl_id, pirl2B.pirl_time as sub_pirl_time FROM Pirl as pirl2B INNER JOIN Pidl as pidl2B ON (pirl2B.pirl_pidl_id = pidl2B.pidl_id) WHERE 1 ) as pirl3B ON ( pirl3B.sub_pi_id = pidl1B.pidl_pi_id and (pirl3B.sub_pirl_time > pirl1B.pirl_time or (pirl3B.sub_pirl_time = pirl1B.pirl_time and pirl3B.sub_pirl_id > pirl1B.pirl_id) ) ) WHERE pirl3B.sub_pirl_id is null ) as pirl1A ON (pirl1A.sub_pi_id = pidl1A.pidl_pi_id) WHERE pidl1A.pidl_status = 1 AND pidl2A.pidl_id IS NULL AND ( pirl1A.sub_pirl_id IS NULL OR ( pidl1A.pidl_hash != pirl1A.sub_pidl_hash ) OR ( pirl1A.sub_pirl_status != 1 ) ) And this is my db schema: CREATE TABLE Pi ( `pi_id` int, PRIMARY KEY (`pi_id`) ) ; CREATE TABLE Pidl ( `pidl_id` int, `pidl_pi_id` int, `pidl_status` int, `pidl_time` int, `pidl_hash` varchar(16), PRIMARY KEY (`pidl_id`) ) ; alter table Pidl add constraint fk1_branchNo foreign key (pidl_pi_id) references Pi (pi_id); CREATE TABLE Pirl ( `pirl_id` int, `pirl_pidl_id` int, `pirl_status` int, `pirl_time` int, PRIMARY KEY (`pirl_id`) ) ; alter table Pirl add constraint fk2_branchNo foreign key (pirl_pidl_id) references Pidl (pidl_id); INSERT INTO Pi (`pi_id`) VALUES (3), (4), (5); INSERT INTO Pidl (`pidl_id`, `pidl_pi_id`,`pidl_status`,`pidl_time`, `pidl_hash`) VALUES (1, 3, 1,100, 'hashA'), (2, 3, 1,150,'hashB'), (3, 4, 2, 200,'hashC'), (4, 3, 1, 200,'hashA') ; INSERT INTO Pirl (`pirl_id`, `pirl_pidl_id`,`pirl_status`,`pirl_time`) VALUES (1, 2, 0,100), (2, 3, 1,150), (3, 1, 2, 200) ; Of course with 3 records it's fast. But with around 10-30k it takes more than 5 seconds. What I've found is that the thing that makes it slow is the last part of the where: AND ( pirl1A.sub_pirl_id IS NULL OR ( pidl1A.pidl_hash != pirl1A.sub_pidl_hash ) OR ( pirl1A.sub_pirl_status != 1 ) ) The other strange thing that I've found is that by using DISTINCT, the query got a bit faster but not fast enough.
When I read your requirements, I come up with a query like this: select pidl.* from pidl left join (select image, max(pidl_time) as pidl_time from pidl group by image ) maxpidl on pidl.image = maxpidl.image and pidl.pidl_time = maxpidl.pidl_time pirl on pidl.hash = pirl.hash where pirl.hash is null; I think you have some other conditions that are not fully explained (such as the role of status). You should be able to incorporate that. In MySQL, you should avoid subqueries in the from clause. These are materialized and -- as a result -- there is additional overhead for that work and the engine cannot subsequently use indexes.
Your queries aren't using your indexes, and are instead using views in a subquery. This can be very slow. I would suggest making new tables that are indexed with the information that you need or a materialized view.
insert using a select from other table with mysql
Trying to insert into other table with the following command but it is neither throwing an error nor inserting: INSERT INTO orderlines(orderLineItemName,orderLineItemnotes,itemID,itemPriceNormal,categoryID ,regionID,orderLineItemQuantity,orderLineItemPriceUnit,orderLineItemDiscount,orderLineItemSubTotal, orderLineItemTotalTax ,orderLineItemStatus,userID,orderLineItemDateCreated,orderLineItemDateUpdated,ordercode) SELECT quoteLineItemName, quoteLineItemnotes, itemID, itemPriceNormal, categoryID, regionID, quoteLineItemQuantity, quoteLineItemPriceUnit, quoteLineItemDiscount, quoteLineItemSubTotal, quoteLineItemTotalTax, quoteLineItemStatus, userID, quoteLineItemDateCreated, quoteLineItemDateUpdated, 'Complete' as orderstatus FROM quoteslines WHERE quotelineitemid = 1
try this INSERT INTO orderlines SELECT quoteLineItemName, quoteLineItemnotes, itemID, itemPriceNormal, categoryID, regionID, quoteLineItemQuantity, quoteLineItemPriceUnit, quoteLineItemDiscount, quoteLineItemSubTotal, quoteLineItemTotalTax, quoteLineItemStatus, userID, quoteLineItemDateCreated, quoteLineItemDateUpdated, 'Complete' as orderstatus FROM quoteslines WHERE quotelineitemid = 1
Is it correct to use "'Complete' as orderstatus" for the last column value. I don't think so. If you want to enter value "Complete" in the last column, please try below. INSERT INTO orderlines(orderLineItemName,orderLineItemnotes,itemID,itemPriceNormal,categoryID ,regionID,orderLineItemQuantity,orderLineItemPriceUnit,orderLineItemDiscount,orderLineItemSubTotal, orderLineItemTotalTax ,orderLineItemStatus,userID,orderLineItemDateCreated,orderLineItemDateUpdated,ordercode) SELECT quoteLineItemName, quoteLineItemnotes, itemID, itemPriceNormal, categoryID, regionID, quoteLineItemQuantity, quoteLineItemPriceUnit, quoteLineItemDiscount, quoteLineItemSubTotal, quoteLineItemTotalTax, quoteLineItemStatus, userID, quoteLineItemDateCreated, quoteLineItemDateUpdated, 'Complete' FROM quoteslines WHERE quotelineitemid = 1
SQL: Auto Increment value during insert
I have the an existing table that for some reason the designer decided to manually control the Primary Key value by storing the last used value in a seperate table (changing the table to use Identity is not an option right now). I now need to do a mass update to this table as follows: DECLARE #NeedFieldID int SET #NeedFieldID = 62034 INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale) ( SELECT DISTINCT n.NeedID, #NeedFieldID + 1, 'DetailedOutcome', 999, 'Detailed Outcome', 'Select appropriate reason for a No Sale outcome', 'T', 'Pricing, Appointment Date / Time Not Available, Will Call Back, Declined', 0 FROM T_L_Need n INNER JOIN T_L_NeedField nf ON n.NeedID = nf.NeedID WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0) ) Obviously '#NeedFieldID + 1' doesn't work (just using it to show what I want to do). How can I increment #NeedFieldID as SQL inserts the values for each of the distinct NeedId's? I am using SQL Server 2008.
You want row_number(): DECLARE #NeedFieldID int SET #NeedFieldID = 62034 INSERT INTO T_L_NeedField (NeedID, NeedFieldID, FieldName, Sequence, DisplayAs, FieldPrompt, DataType, ValidOptions, IsRequiredForSale) ( SELECT DISTINCT n.NeedID, #NeedFieldID + row_number() over (order by n.NeedID), 'DetailedOutcome', 999, 'Detailed Outcome', 'Select appropriate reason for a No Sale outcome', 'T', 'Pricing, Appointment Date / Time Not Available, Will Call Back, Declined', 0 FROM T_L_Need n INNER JOIN T_L_NeedField nf ON n.NeedID = nf.NeedID WHERE (n.Need LIKE 'Schedule%' AND n.Disabled = 0) ) However, your best bet is to make NeedFieldID an identity column and just let SQL Server do the work for you.