Update Query that Lists Rows Not Updated - sql
I have a 12 million row SQL Server table that when I run the following query it shows approximately 11.6 million rows updated:
UPDATE [HCRIS]
SET [HCRIS].[ST_ABB] = dbo.[PRVDR_CHANGE].[state_abbreviation]
FROM [HCRIS]
INNER JOIN dbo.[PRVDR_CHANGE]
ON [HCRIS].[PRVDR_NUM] = dbo.[PRVDR_CHANGE].[PRVDR_NUM]
WHERE [HCRIS].[PRVDR_NUM] = dbo.[PRVDR_CHANGE].[PRVDR_NUM];
I have checked for nulls and non-numeric values in a numeric column but would love to pinpoint those rows that were not updated. My intent is to update all rows.
Thank you.
Use EXCEPT to find rows that won't get updated - where you select all rows in the first query and rows you would have updated in the second.
SELECT H.*
FROM [HCRIS] H
EXCEPT
SELECT H.*
FROM dbo.[HCRIS] H
INNER JOIN dbo.[PRVDR_CHANGE] C
ON H.[PRVDR_NUM] = C.[PRVDR_NUM]
WHERE H.[PRVDR_NUM] = C.[PRVDR_NUM];
Related
Select only the last date when two columns are duplicate
I need to select seven columns from three different tables, only when one of the columns has a particular value. I also need to select only the last date when two columns (TAGNAME and TAGNUMMER) are both duplicate. I'm using the following code: select c.AKEY, c.AKT_DATUM, c.TAGNAME, c.TAGNUMMER, cd.TEILANLAGEN_ID, x.TP_GSAP_KZ, c.KLASSEN_ID from T0EM01 c, T0EM03 x, T0AD07 cd where cd.TEILANLAGEN_ID = '219A' inner join (select c.TAGNAME and c.TAGNUMMER max(C.AKT_DATUM) where T0EM01 c c.TAGNAME and T0EM01 c c.TAGNUMMER = m.max_date Up to where cd.TEIANLAGEN_ID = '219A' it works fine (but there are over 2 million rows). How can I filter so that when both TAGNAME and TAGNUMMER are repeated in two or more rows I only select the latest date?
"Over 2 million rows" could be less if you properly joined those 3 tables. The way you put it, you're producing Cartesian join and got way too many rows. from t0em01 c, t0em03 x, t0ad07 cd I have no idea how are they to be joined to each other so I'm just guessing; you should know. As of the "max date value", one option might be to use a subquery, also properly joined to other table(s). Once again, I don't know how exactly to join them. Improve it: select c.akey, c.akt_datum, c.tagname, c.tagnummer, cd.teilanlagen_id, x.tp_gsap_kz, c.klassen_id from t0em01 c join t0em03 x on x.id = c.id --> I'm just join t0ad07 cd on cd.id = c.id -- guessing here where cd.teilanlagen_id = '219A' and c.akt_datum = (select max(c1.akt_datum) --> subquery, to return from t0em01 c1 -- only the MAX date value where c1.tagname = c.tagname and c1.tagnummer = c.tagnummer );
Oracle SQL update statement how to update two rows at a time
I tried to update two rows in a table. If I used: update ERNTESTUPDATE a set (date_loaded, acad_career) = (select distinct b.date_loaded, b.acad_career from PS_STDNT_ENRL b where rownum=1) where to_char(date_created) = to_char(trunc(sysdate)) ; I got 2 rows updated as 11/29/18 UGRD 11/29/18 UGRD If I used: update ERNTESTUPDATE a set (date_loaded, acad_career) = (select distinct b.date_loaded, b.acad_career from PS_STDNT_ENRL b where a.date_loaded = b.date_loaded ) where to_char(date_created) = to_char(trunc(sysdate)) ; I got an error single-row subquery returns more than one row How to get a result as below: 11/29/18 UGRD 11/29/18 GRAD Thank you, Kate
The subquery needs to return a SINGLE row. That works well when you include the condition rownum=1 in the first one: select distinct b.date_loaded, b.acad_career from PS_STDNT_ENRL b where rownum=1 -- this filter makes sure only one row is returned If you remove that condition, then the subquery will return multiple rows, and that makes the whole UPDATE fail.
Oracle SQL query that deals with inner Joins and values
SELECT sc.TAAC_SHARE_CLASS_ID, SCS.SHARE_CLASS_SID, SCS.REPORTING_DT, SCS.SHARE_CLASS_SNAPSHOT_SID, SCS.DIST_UNMOD_30_DAY_YIELD_PCT, SCS.DER_DIST_12_MO_YIELD_PCT, SCS.DER_SEC_30_DAY_YIELD_PCT AS SCS_DER_SEC_30_DAY_YIELD_PCT, SCS.DER_SEC_RESTATED_YIELD_PCT AS SCS_DER_SEC_RESTATED_YIELD_PCT FROM SHARE_CLASS sc INNER JOIN PORTFOLIO P ON (P.PORTFOLIO_SID=SC.PORTFOLIO_SID) INNER JOIN SHARE_CLASS_SNAPSHOT SCS ON (SCS.SHARE_CLASS_SID=sc.SHARE_CLASS_SID) WHERE SCS.REPORTING_DT = '24-JUL-17' AND P.PORTFOLIO_ID = 638; I ran this query and got the following output : image Here, instead of getting separate rows for the same TAAC_SHARE_CLASS_ID, I want to merge the outputs of same TAAC_SHARE_CLASS_ID. For example, the first row with TAAC_SHARE_CLASS_ID = 000648 should have values for all the 4 columns : SCS.DIST_UNMOD_30_DAY_YIELD_PCT, SCS.DER_DIST_12_MO_YIELD_PCT, SCS.DER_SEC_30_DAY_YIELD_PCT, SCS.DER_SEC_RESTATED_YIELD_PCT. Hence the first row should have values for those columns as 2.96,3.2972596, 7541.085263433, 7550. The last 4 rows of my output are not really required, as we have now merged those data into first 4 rows correspondingly. How can I alter this query to achieve the same? Please help.
I suggest you group your results by TAAC_SHARE_CLASS_ID column, and MAX() the remaining columns, something like this: SELECT sc.TAAC_SHARE_CLASS_ID, max(SCS.SHARE_CLASS_SID) as SHARE_CLASS_SID, max(SCS.REPORTING_DT) as REPORTING_DT, max(SCS.SHARE_CLASS_SNAPSHOT_SID) as SHARE_CLASS_SNAPSHOT_SID, max(SCS.DIST_UNMOD_30_DAY_YIELD_PCT) as DIST_UNMOD_30_DAY_YIELD_PCT, max(SCS.DER_DIST_12_MO_YIELD_PCT) as DER_DIST_12_MO_YIELD_PCT, max(SCS.DER_SEC_30_DAY_YIELD_PCT) AS SCS_DER_SEC_30_DAY_YIELD_PCT, max(SCS.DER_SEC_RESTATED_YIELD_PCT) AS SCS_DER_SEC_RESTATED_YIELD_PCT FROM SHARE_CLASS sc INNER JOIN PORTFOLIO P ON (P.PORTFOLIO_SID=SC.PORTFOLIO_SID) INNER JOIN SHARE_CLASS_SNAPSHOT SCS ON (SCS.SHARE_CLASS_SID=sc.SHARE_CLASS_SID) WHERE SCS.REPORTING_DT = '24-JUL-17' AND P.PORTFOLIO_ID = 638 GROUP BY sc.TAAC_SHARE_CLASS_ID;
Slow ORDER BY in large table
I have problem with ORDER BY clause. When I remove ORDER BY in following query, query is finished in 0.004 seconds. If I keep it, query is running very slow = 56 seconds. It is because MySQL is first grabbing all 500 000 records, then sorting and finally returing only first 18 records. How can I solve this big table ordering problem ? Thanks. Explain: http://img444.imageshack.us/img444/9440/explain.png SQL Query: SELECT `_sd`.`sazbaDPHId`, `_sd`.`sazbaDPH`, `_sd`.`sazbaDPHProcent`, `_zk`.`zboziKategorieId`, `_zk`.`zboziId`, `_zk`.`kategorieId`, `_zk`.`zboziKategoriePoradi`, `_k`.`kategorieId`, `_k`.`kategorieNazev`, `_k`.`kategorieCelyNazev`, `_k`.`kategorieKod`, `_k`.`kategorieCesta`, `_k`.`kategoriePopis`, `_k`.`kategorieKeywords`, `_k`.`kategorieRodiceId`, `_k`.`kategoriePoradi`, `_k`.`kategorieSkryta`, `_k`.`kategorieVTopMenu`, `_v`.`vyrobceId`, `_v`.`vyrobceNazev`, `_v`.`vyrobceKod`, `_v`.`vyrobceKoeficient`, `_tzvz`.`typZboziVlastnostZboziId`, `_tzvz`.`typZboziId`, `_tzvz`.`vlastnostZboziId`, `_vzh`.`vlastnostZboziHodnotaId`, `_vzh`.`zboziId`, `_vzh`.`vlastnostZboziId`, `_vzh`.`vlastnostZboziHodnota`, `zvc`.`zboziVyslCenaId` AS`zvc_zboziVyslCenaId`, `zvc`.`zboziVyslCenaZboziId` AS`zvc_zboziVyslCenaZboziId`, `zvc`.`vyslCena` AS`zvc_vyslCena`, `zvc`.`vyslCenaSDPH` AS`zvc_vyslCenaSDPH`, `this`.`zboziId`, `this`.`zboziNazev`, `this`.`zboziKod`, `this`.`zboziIdentifikator`, `this`.`zboziPartNum`, `this`.`zboziEAN`, `this`.`zboziPopis`, `this`.`zboziOstatniParametry`, `this`.`zboziInterniInfo`, `this`.`zboziProdejniCena`, `this`.`zboziAkcniCena`, `this`.`zboziSetovaCena`, `this`.`zboziMocCena`, `this`.`sazbaDPHId`, `this`.`vyrobceId`, `this`.`typZboziId`, `this`.`stavZboziId`, `this`.`skladovaDostupnostId`, `this`.`zdrojCenId`, `this`.`zboziPHE`, `this`.`zboziAutorskyPoplatek`, `this`.`zboziVahovyPoplatek`, `this`.`nemenitStavZbozi` FROM `tbl_Zbozi`AS this LEFT JOIN `reg_SazbaDPH`AS _sd ON this.sazbaDPHId = _sd.sazbaDPHId LEFT JOIN `tbl_Zbozi_Kategorie`AS _zk ON this.zboziId = _zk.zboziId LEFT JOIN `tbl_Kategorie`AS _k ON _zk.kategorieId = _k.kategorieId LEFT JOIN `tbl_Vyrobce`AS _v ON this.vyrobceId = _v.vyrobceId LEFT JOIN `tbl_TypZbozi_VlastnostZbozi`AS _tzvz ON this.typZboziId = _tzvz.typZboziId LEFT JOIN `tbl_VlastnostZboziHodnota`AS _vzh ON this.zboziId = _vzh.zboziId AND _vzh.vlastnostZboziId = _tzvz.vlastnostZboziId LEFT JOIN `tbl_Zbozi_VyslCena`AS zvc ON this.zboziId = zvc.zboziVyslCenaZboziId WHERE _k.kategorieId IN (155317, 5570, 155445, 5706, 5707, 155429, 155430, 155431, 5708, 5709, 5710, 155427, 155426, 155428, 11413, 5713, 5714, 5715, 5716, 5717, 5718, 5719, 5720, 10245, 10253, 11253, 10834, 10269, 10249, 10246, 10247, 10248, 5723, 5725, 5726, 5727, 5728, 5729, 155319, 5815, 5816, 5817, 5818, 5819, 5822, 5824, 5832, 11406, 11411, 11410, 11409, 6069, 6070, 6072, 6073, 6075, 6078, 6086, 11414, 6185, 155433, 6186, 6187, 6188, 6190, 6191, 6193, 6198, 6199, 6200, 6201, 6202, 6203, 6207, 6209, 11442, 6210, 6211, 6212, 6215, 6216, 6217, 6218, 6219, 6220, 155366, 6221, 11339, 11340, 11341, 11359, 6222, 6223, 6224, 6225, 6226, 6227, 6228, 11099, 155376, 6231, 6232, 6233, 6234, 6235, 6236, 155391, 155392, 155437, 6237, 6238, 6241, 6243, 6244, 6245, 6246, 6247, 6248, 6249, 6250, 6251, 6252, 6253, 6254, 6256, 6257, 6258, 6259, 6260, 6261, 10839, 155362, 6262, 6263, 6264, 6265, 155361, 6267, 6269, 11390, 11346, 11112, 11394, 11397, 155393, 6270, 11436, 10292, 6271, 6272, 6275, 6277, 6278, 6279, 6280, 6281, 11348, 10288, 11113, 6283, 6284, 6285, 6287, 155494, 11114, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6300, 6301, 6302, 6303, 6304, 11116, 6305, 10781, 6306, 6307, 6308, 6309, 6310, 6311, 6313, 6314, 6315, 6316, 6317, 6318, 6327, 6328, 155451, 6333, 6334, 6335, 6337, 6340, 6342, 6343, 6344, 6345, 6346, 11344, 11389, 10289, 10291, 10302, 10303, 10304, 10294, 10306, 10300, 10305, 10293, 10299, 10298, 10290, 10296, 10297, 11454, 11100, 11101, 11117, 131475, 11402, 5680, 5684, 5685, 5686, 5687, 5688, 5689, 11383, 5702, 5703, 5704, 5705) AND stavZboziId IN (2) AND zvc.zboziVyslCenaSkupinaId = '8' ORDER BY _k.kategoriePoradi ASC LIMIT 18
How else could it work? If it applied the order after selecting the 18 records you would get the top 18 records in the default order, which it would then sort. You might get better performance by inserting all the values in your IN statement into a temp table and then joining to the temp table.
it still has to sort 500,000 records to find your 18 so it will be alot slower, you can speed it up by adding indexes to your kategoriePoradi column in your tables
MAX Subquery in SQL Anywhere Returning Error
In sqlanywhere 12 I wrote the following query which returns two rows of data: SELECT "eDatabase"."Vendor"."VEN_CompanyName", "eDatabase"."OrderingInfo"."ORD_Timestamp" FROM "eDatabase"."OrderingInfo" JOIN "eDatabase"."Vendor" ON "eDatabase"."OrderingInfo"."ORD_VEN_FK" = "eDatabase"."Vendor"."VEN_PK" WHERE ORD_INV_FK='7853' AND ORD_DefaultSupplier = 1 Which returns: '**United Natural Foods IN','2018-02-07 15:05:15.513' 'Flora ','2018-02-07 14:40:07.491' I would like to only return the row with the maximum timestamp in the column "ORD_Timestamp". After simply trying to select by MAX("eDatabase"."OrderingInfo"."ORD_Timestamp") I found a number of posts describing how that method doesn't work and to use a subquery to obtain the results. I'm having difficulty creating the subquery in a way that works and with the following query I'm getting a syntax error on my last "ON": SELECT "eDatabase"."Vendor"."VEN_CompanyName", "eDatabase"."OrderingInfo"."ORD_Timestamp" FROM ( "eDatabase"."OrderingInfo" JOIN "eDatabase"."OrderingInfo" ON "eDatabase"."Vendor"."VEN_PK" = "eDatabase"."OrderingInfo"."ORD_VEN_FK" ) INNER JOIN (SELECT "eDatabase"."Vendor"."VEN_CompanyName", MAX("eDatabase"."OrderingInfo"."ORD_Timestamp") FROM "eDatabase"."OrderingInfo") ON "eDatabase"."Vendor"."VEN_PK" = "eDatabase"."OrderingInfo"."ORD_VEN_FK" WHERE ORD_INV_FK='7853' AND ORD_DefaultSupplier = 1 Does anyone know how I can adjust this to make the query correctly select only the max ORD_Timestamp row?
try this: SELECT TOP 1 "eDatabase"."Vendor"."VEN_CompanyName", "eDatabase"."OrderingInfo"."ORD_Timestamp" FROM "eDatabase"."OrderingInfo" JOIN "eDatabase"."Vendor" ON "eDatabase"."OrderingInfo"."ORD_VEN_FK" = "eDatabase"."Vendor"."VEN_PK" WHERE ORD_INV_FK='7853' AND ORD_DefaultSupplier = 1 order by "ORD_Timestamp" desc this orders them biggest on to and say only hsow the top row