single line sub query returns multiple rows
Hi, please help me to solve this, working with oracle 11g.Update t1 set t1.twyindex = twypoly (select twyindex from twyinfo where t1.id = t2.id t2);
the error message is:
*
ERROR on line 1:
ORA-01427: einreihig subquery returns multiple rows
Thank you
don123 wrote:
Hi paul, thanks...duplicate existing due to the business logic data.
can I use the SQL mentioned above for all cases?
is it mandatory to remove duplicates?
Please provide your suggestions...
If the company says duplicates are allowed, you have to ask the person who wants what, of the different twyindexes, that they want to use
updating twyinfo table...
I use the SQL proposed until they tell you that twyindex to use.
Tags: Database
Similar Questions
-
How to know what sub query returns multiple rows
Hi all
Someone can give me hints, how to know what sub query returns many rows in the following query.
Kind regards/* Formatted on 2011/05/17 19:22 (Formatter Plus v4.8.8) */ SELECT a.*, ROWNUM AS rnm FROM (SELECT DISTINCT '1' AS "Page View", ou.org_unit_name AS "Org", prxm.mbr_idntfr AS "Beneficiary ID", md.last_name || ', ' || md.first_name AS "Beneficiary Name", pci.idntfr AS "Tracking No.", TO_CHAR (TRUNC (req.pa_rqst_date), 'MM/dd/yyyy' ) AS "Request Date", sts.status_name AS "Status", req.pa_rqst_sid AS "Request #", prxm.mbr_sid AS "Mbr_sid", TO_CHAR (TRUNC (req.pa_revision_date), 'MM/dd/yyyy' ) AS "Last Updated", TO_CHAR (psd.TO_DATE, 'MM/dd/yyyy') AS "TO_DATE", prxpl.prvdr_lctn_iid AS "PRVDR_LCTN_IID", pd.prvdr_sid AS "PRVDR_SID", 'Y' AS "State View", DECODE ((SELECT DISTINCT pd.national_prvdr_idntfr FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR'), 0, (SELECT prxplo.prvdr_lctn_idntfr FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR'), NULL, (SELECT prxplo.prvdr_lctn_idntfr FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR'), (SELECT DISTINCT pd.national_prvdr_idntfr FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR') ) AS "NPI/ID", DECODE ((SELECT pd.org_bsns_name FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR'), NULL, (SELECT pd.last_name || ', ' || pd.first_name || ' ' || pd.middle_name FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR'), (SELECT pd.org_bsns_name FROM pa_request_x_provider_location prxplo WHERE prxplo.pa_rqst_sid = req.pa_rqst_sid AND prxplo.oprtnl_flag = 'A' AND prxplo.pa_prvdr_type_lkpcd = 'RR') ) AS "Prvdr Name", TO_CHAR (psd.from_date, 'MM/dd/yyyy' ) AS "Srvc From Date", TO_CHAR (req.validity_start_date, 'MM/DD/YYYY' ) AS "Due Date", (fn_get_busniess_days (TRUNC (req.validity_start_date)) ) AS "Days<br>Left", req.pa_mode_type_lkpcd AS "Source", TO_CHAR (TRUNC (wmdtl.rtng_date), 'MM/dd/yyyy' ) AS "Assigned On", NVL (wmdtl.assigned_to_user_name, 'Not Assigned' ) AS "Assigned To", req.org_unit_sid AS "OrgUnitSid", TO_CHAR (wmdtl.modified_date, 'MM/dd/yyyy hh24:mi:ss' ) AS "WTRD_MODIFIED_DATE", TO_CHAR (wmdtl.rtng_date, 'MM/dd/yyyy' ) AS "WTRD_RTNG_DATE", req.status_cid AS "PA_STATUS_CID", TO_CHAR (req.modified_date, 'MM/dd/yyyy' ) AS "PA_REQ_MODIFIED_DATE", prs.state_pa_srvc_type_code AS "STATE_PA_SRVC_TYPE_CODE", wmdtl.wm_pa_task_rtng_dtl_sid AS "WM_TASK_RTNG_DTL_SID", wmdtl.assigned_to_user_acct_sid AS "WTRD_Assigned_to_user_acct_sid", (fn_get_busniess_days (TRUNC (req.validity_start_date)) ) AS "Days<br>LeftSort", wmdtl.assigned_to_org_unit_sid AS "WTRD_Assigned_to_OrgUntSid", DECODE ((SELECT COUNT (*) FROM pa_request_status prs WHERE prs.pa_rqst_sid = req.pa_rqst_sid AND prs.status_cid = 5 AND prs.oprtnl_flag = 'I'), 0, 'N', 'Y' ) AS "SHOW_UTILIZATION" FROM pa_request req, pa_certification_identifier pci, status sts, pa_request_x_member prxm, wm_pa_task_routing_detail wmdtl, pa_service_date psd, org_unit ou, pa_request_service prs, pa_request_x_provider_location prxpl, provider_location pl, provider_detail pd, provider p, mbr_dmgrphc md WHERE req.oprtnl_flag = 'A' AND req.status_cid NOT IN (20, 30, 70, 25, 80, 96, 85, 5, 97, 98, 101) AND req.org_unit_sid IN (3057, 3142, 3058, 3143, 3059, 3144, 3060, 3145, 3061, 3146, 3062, 3147, 3063, 3148, 3064, 3149, 3065, 3150, 3066, 3151, 3067, 3152, 3068, 3153, 3069, 3154, 3070, 3155, 3071, 3156, 3072, 3157, 3073, 3158, 3074, 3159, 3075, 3160, 3076, 3161, 3077, 3162, 3078, 3163, 3079, 3164, 3080, 3165, 3081, 3166, 3082, 3167, 3083, 3168, 3084, 3169, 3085, 3170, 3086, 3171, 3087, 3172, 3088, 3173, 3089, 3174, 3090, 3175, 3091, 3176, 3092, 3177, 3093, 3178, 3094, 3179, 3095, 3180, 3096, 3181, 3097, 3182, 3098, 3183, 3099, 3184, 3100, 3185, 3101, 3186, 3102, 3187, 3103, 3003, 75000104, 75000108, 2006, 75000103, 75000102, 75000113, 75000111, 75000109, 2001, 2009, 75000105, 75000107, 2004, 2010, 2013, 2014, 2005, 2011, 75000112, 2002, 1001, 2012, 75000106, 2007, 75000101, 2003, 75000110, 2008, 3001, 3002, 3019, 3104, 3020, 3105, 3021, 3106, 3022, 3107, 3023, 3108, 3024, 3109, 3025, 3110, 3026, 3111, 3027, 3112, 3028, 3113, 3029, 3114, 3030, 3115, 3031, 3116, 3032, 3117, 3033, 3118, 3034, 3119, 3035, 3120, 3036, 3121, 3037, 3122, 3038, 3123, 3039, 3124, 3040, 3125, 3041, 3126, 3042, 3127, 3043, 3128, 3044, 3129, 3045, 3130, 3046, 3131, 3047, 3132, 3048, 3133, 3049, 3134, 3050, 3135, 3051, 3136, 3052, 3137, 3053, 3138, 3054, 3139, 3055, 3140, 3056, 3141) AND req.pa_rqst_sid = prs.pa_rqst_sid AND prs.oprtnl_flag = 'A' AND prs.pa_rqst_srvc_sid = psd.pa_rqst_srvc_sid AND psd.oprtnl_flag = 'A' AND req.pa_rqst_sid = pci.pa_rqst_sid AND pci.oprtnl_flag = 'A' AND req.pa_rqst_sid = prxm.pa_rqst_sid AND prxm.oprtnl_flag = 'A' AND md.oprtnl_flag = 'A' AND md.status_cid = 2 AND TRUNC (SYSDATE) BETWEEN md.from_date AND md.TO_DATE AND prxm.mbr_sid = md.mbr_sid AND ou.org_unit_sid = req.org_unit_sid AND ou.oprtnl_flag = 'A' AND req.pa_rqst_sid = prxpl.pa_rqst_sid AND prxm.pa_rqst_sid = prxpl.pa_rqst_sid AND pci.pa_rqst_sid = prxm.pa_rqst_sid AND pci.pa_rqst_sid = wmdtl.subsystem_task_sid AND pci.pa_rqst_sid = prxpl.pa_rqst_sid AND prxpl.pa_prvdr_type_lkpcd = 'RR' AND prxpl.oprtnl_flag = 'A' AND req.status_cid = sts.status_cid AND sts.status_type_cid = 3 AND sts.oprtnl_flag = 'A' AND prxpl.prvdr_lctn_iid = pl.prvdr_lctn_iid AND p.prvdr_sid = pd.prvdr_sid AND p.prvdr_sid = pl.prvdr_sid AND pd.oprtnl_flag = 'A' AND pd.status_cid = 2 AND TRUNC (SYSDATE) BETWEEN pd.from_date AND pd.TO_DATE AND wmdtl.subsystem_task_sid = req.pa_rqst_sid AND wmdtl.subsystem_lkpcd = 'PA' AND wmdtl.oprtnl_flag = 'A' AND req.pa_rqst_date > (SYSDATE - 365) ORDER BY TO_DATE ("Request Date", 'MM/dd/yyyy hh24:mi:ss') DESC, "Beneficiary Name" ASC) a WHERE ROWNUM < 102;
Prakash P
Published by: BluShadow on May 17, 2011 15:01
addition of {noformat}{noformat} tags around the code
3360 wrote:
See point 9 of this section of the FAQ on how to format the code.I see that you did.
No, I did. It's pretty easy to change if the code seems formatted anyway below. It's when I go to edit the message and find no sense because it is not formatted in all cases, I despair. {noformat} :) {noformat}
-
Can't understand why this query returns multiple lines with the same data
Hi all
I am a relative novice and self-taught when it comes to SQL. I wrote a query to our reporting tool that returns multiple rows, and I can't understand why. I know that I can use the SELECT DISTINCT option, but it really slows the execution when I do. I'd really rather understand if I can change the code to avoid the multiples. This is the query. I've included a few statements in italics to help explain the break. Any ideas?
SELECT MATSITE, MATPONUM, FIRSTRECPTDATE
Of
Subquery that concludes the first date on which purchase orders have been implemented with ACK State
(SELECT ACKSTAT. PONUM AS 'ACKPONUM', (MIN (ACKSTAT. CHANGEDATE)) AS 'FIRSTACKDATE '.
OF PZMAX. POSTATUS ACKSTAT
WHERE (ACKSTAT. STATE = 'ACK') AND (ACKSTAT.ORGID ='CGSALTUS)
GROUP OF ACKSTAT. PONUM),
Subquery that concludes the first reception against a purchase order transaction for purposes of comparison
(SELECT TRANS. PONUM AS "MATPONUM", TRANS. SITEID AS 'MATSITE', (MIN (TRANS. TRANSDATE)) AS 'FIRSTRECPTDATE '.
OF PZMAX. MATRECTRANS TRANS
WHERE (TRANS.ORGID ='CGSALTUS) AND (TRANS. HOUR > =: startDate and TRANS. TRANSDATE < =: endDate)
TRANS GROUP. SITEID, TRANS. PONUM)
WHERE
(ACKPONUM = MATPONUM AND FIRSTRECPTDATE < FIRSTACKDATE) OR (NOT EXISTS (SELECT 1 FROM PZMAX. POSTATUS ACKSTAT2 WHERE (ACKSTAT2. PONUM = MATPONUM) AND (ACKSTAT2. STATE = 'ACK') AND (ACKSTAT2.ORGID ='CGSALTUS)))
The where the instruction is intended to find when one of two conditions exists. ((1) received happened before the command either in ACK or 2) a reception that's happened, but the purchase order is never in ACK State. It seems that this second condition that creates multiple lines.
Any thoughts will be appreciated geratly.
Dave Teece
-
If a view object query returns no rows, can the vacuum to be tested at all?
All those who know or have also experienced:
I guess that the answer should be Yes, but I tried anyway, I still didn't worked. Here is the code (it's a method behind a command button, a bean of support (I use JDeveloper 10.1.3.4).) In the code, LoggedInStudent is the name of a view object; ZBLCModule is the name of the application module):
When the view object query returns a line, the whole of the application works without error. When the query returns no rows, test (1) always bombs toward the top of the application, prompting a Houston-30003 error.public String commandButton1_action() { FacesContext fc = FacesContext.getCurrentInstance(); ValueBinding vb = fc.getApplication().createValueBinding("#{data}"); BindingContext bc = (BindingContext)vb.getValue(fc); DCDataControl dc = bc.findDataControl("ZBLCModuleDataControl"); ApplicationModule am = (ApplicationModule)dc.getDataProvider(); ZBLCModuleImpl zblcam = (ZBLCModuleImpl)am; LoggedInStudentImpl studentsFound = (LoggedInStudentImpl)zblcam.getLoggedInStudent(); String navCase = null; // Test (1): if the view cache is empty; always bombs up the application if it IS empty: if(studentsFound.getAllRowsInRange().length == 0) { navCase = "userNotFound"; // (2) The following three tests gets to run only when the cache is not empty; they work fine. } else if (((Number)studentsFound.first().getAttribute("HoursAttm")).floatValue() == 0.0) { navCase = "noHours"; } else if (((Number)studentsFound.first().getAttribute("Balance")).floatValue() > 0.0) { navCase = "notZero"; } else if (!(studentsFound.first().getAttribute("Validated").equals(" "))) { navCase = "validated"; } else { navCase = "zeroBal"; } return navCase; }
(1) test, I tried the following:
With each of these events, I got an error of Houston-30003. It does not matter what looks like the conditional test; It is important only when the objects from view cache is empty. If the view cache is not empty, everything, including the test (1), works very well. And when the cache is empty is not because of the failure of the connection to the database, but because the student is not in the data table and line are for the student.if (studentsFound.getAllRowsInRange().length == 0) if (studentsFound.first() == null) if (studentsFound.getEstimatedRowCount() == 0) if (studentsFound.isDead()) //I do not know what isDead() does; just tried desperately. if (studentsFound.equals(null)) if (studentsFound.getCurrentRow() == null)
It is a requirement of the company to do something when the view object query returns no rows. Can it be tested at all? How?
Or is there something wrong in the first lines in the method before the {color: green} String navCase = null; {color} line?
Thank you very much for your help!
NewmanHello
What you have done, is to get a handle to the object that CAN execute queries to the database.
However, you do not query the database.Just add:
LoggedInStudentImpl studentsFound = (LoggedInStudentImpl)zblcam.getLoggedInStudent(); //New line studentsFound.executeQuery();
The code that Shay has given you is when you do not have a request for all module, but since you are talking about a command etc button I guess that the module of the application is already active.
The line I gave you should be enough to make it work.I'd be careful with the
studentsFound.hasNext();
I suggest to use estimatedRowCount();
-Anton
-
Oracle Text multi column index based query returns no rows
Hello
I have a MAH_KERESES_MV table with 3 columns OBJEKTUM_NEV, KERESES_SZOVEG_1, KERESES_SZOVEG_2. I create the following Oracle multi column text index:
ctx_ddl.create_preference exec ('MAH_SEARCH', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute exec ('MAH_SEARCH', 'COLUMNS', 'OBJEKTUM_NEV, KERESES_SZOVEG_1, KERESES_SZOVEG_2');
create index MAX_KERES_CTX on MAH_KERESES_MV (OBJEKTUM_NEV)
indexType is ctxsys.context
parameters ("DATASTORE MAH_SEARCH");
But the query returns no rows, although if I make the query with the 'like' operator, and then I get the results as expected:
SELECT id, OBJEKTUM_NEV
OF MAH_KERESES_MV
WHERE CONTAINS (OBJEKTUM_NEV, "C") > 0;
Can some body please help? TIA,
TamasYou can do it in Oracle Text, well it is not necessarily desirable.
You can search the
WHERE CONTAINS(OBJEKTUM_NEV, '%C%')>0;
And it will probably work in a simple test. However, using a leader like this wildcard prevents them the index on the table "list of words" used, so such a request can be very slow on a large system.
You can improve this by using SUBSTRING_INDEX, but making your much bigger index. And you could always hit the 'expansions too' problem if %C % expansion is more than about 15,000 words (depending on version and different settings).Also be aware of differences in case - %C % will match 'fact' or 'FACT', as part of a CONTAINS, but not part of a TYPE.
-
A row of Sub query returns more than 1 row!
I'm trying to update the values in one table from another table and get the error: void line query returns More Than 1 row.
I want to PRV_NAME B chart updated in the table A PRV_NAME where A.PRVID = B.PRVID where B.PRV_TYPE = M"
The two paintings were all unique PRVID, however, table B has PRVID that have the same name. So the data in table B can look like this:
PRVID PRV_NAME
1234 PHOENIX MED
1235 MED BAG
1236 MED BAG
1237 OVERLAND
etc...
So, as you can see are the unique PRVID, but not the PRV_NAME. Is this the reason why I get this error?
I do not build the tables and have no control over what is put in them. If this is the reason for the error, is there a way to fix this?
For reference, here's the request. Maybe there's something wrong with that?
Update msb_prv_source ps
Set ps.prv_name =
(select prv00.prv00_prv_name
of prv00_prv prv00
Join msb_prv_source ps
On prv00.prv00_prv_id = ps.prvid
where prv00.prv00_prv_type = am')
Published by: user12296489 on April 19, 2013 10:46/* Formatted on 4/19/2013 2:00:43 PM (QP5 v5.185.11230.41888) */ MERGE INTO msb_prv_source a USING (SELECT * FROM prv00_prv WHERE prv00_prv_type = 'M') b ON (a.prv00_prv_id = b.prvi) WHEN MATCHED THEN UPDATE SET a.prv_name = prv00_prv_name
-
Help in the treatment of "subquery returns multiple rows.
Appreciate your help on this.
I have under sql query fails with the error "ORA-01427: einreihig subquery returns multiple lines"
WITH t AS (SELECT 'A' Col1, 'B' Col2, 'C' Col3 FROM DUAL UNION SELECT 'D', 'E', 'F' FROM DUAL UNION SELECT 'E', 'F', 'G' FROM DUAL UNION SELECT 'A', 'T', 'U' FROM DUAL), t1 AS (SELECT 'A' Col1, 'B' Col2, 'C' Col3 FROM DUAL UNION SELECT 'D1', 'E1', 'F1' FROM DUAL UNION SELECT 'D', 'E', 'F' FROM DUAL UNION SELECT 'S', 'V', 'W' FROM DUAL), t2 AS (SELECT 'A' Col1, 'B' Col2, 'C' Col3 FROM DUAL UNION SELECT 'A', 'E1', 'F1' FROM DUAL UNION SELECT 'D', 'E', 'F' FROM DUAL) SELECT t.col1, (SELECT distinct col2 FROM t2 WHERE t2.col1 = t.col1) RND_COL FROM t, t1 WHERE t.col1 = t1.col1 WhenI checked the count using below query WITH t AS (SELECT 'A' Col1, 'B' Col2, 'C' Col3 FROM DUAL UNION SELECT 'D', 'E', 'F' FROM DUAL UNION SELECT 'E', 'F', 'G' FROM DUAL UNION SELECT 'A', 'T', 'U' FROM DUAL), t1 AS (SELECT 'A' Col1, 'B' Col2, 'C' Col3 FROM DUAL UNION SELECT 'D1', 'E1', 'F1' FROM DUAL UNION SELECT 'D', 'E', 'F' FROM DUAL UNION SELECT 'S', 'V', 'W' FROM DUAL), t2 AS (SELECT 'A' Col1, 'B' Col2, 'C' Col3 FROM DUAL UNION SELECT 'A', 'E1', 'F1' FROM DUAL UNION SELECT 'D', 'E', 'F' FROM DUAL) SELECT t.col1, (SELECT count(col2) FROM t2 WHERE t2.col1 = t.col1) RND_COL FROM t, t1 WHERE t.col1 = t1.col1 (+) it shows as below ----------------- COL1 RND_COL A 2 A 2 D 1 E 0 My Requirement is for all the values in the column 'RND_COL' > 1 it should display text as 'Multiple', for 'RND_COL' = 1 display actual value returned by sub query and 'RND_COL' = 0 display it as NULL. expected output ------------------- COL1 RND_COL A Multiple A Multiple D E E NULL
Hello
Here's another way. It's like the solution in response #1, but it does not use a subquery:
SELECT t.col1
CASE
WHEN COUNT (DISTINCT t2.col2) > 1
THEN "Multiple."
For ANOTHER MIN (t2.col2)
END AS rnd_col
T
LEFT OUTER JOIN t2 ON t2.col1 = t.col1
GROUP OF t.col1, t.col2, t.col3
ORDER BY t.col1
;
This assumes that in table t (col1, col2, col3) combination is unique. If theat is not the case, change the GROUP BY clause, but you need to ensure that all lines of t becomes a separate group.
-
USERENV ('sessionid') returns multiple rows
Hello
Im trying to put in place a db trigger that will record all DDL operations on the db.
for which purpose the following statement is included in the trigger to return information about the user who wishes to make changes:
problem is that this statement returns multiple lines when 2 users are connected to the same database by using the same username for example SYS;select osuser, machine, process, program, AUDSID, sid, SERIAL# from v$session where AUDSID=USERENV('sessionid');
I see that audsid is the same for these 2 users, but the osuser, the machine etc. are different, so I can easily tell who is who.
How to distinguish these in the query to be able to capture only the actually executing the DDL operation?
ID appreciate any advice
Thank you very much
Rgdsselect osuser, machine, process, program, AUDSID, sid, SERIAL# from v$session where SID=USERENV('sid') /
Published by: JohnWatson on November 23, 2012 14:32
addedtags
-
Stupid old backpacker (me) cannot understand why this query returns 1 row
Hi all
In reference to {: identifier of the thread = 2456973}, why do
only 1 rank and not 1 for each task? In fact, I had to test it myself to believe.select sum(count(decode(job, 'CLERK', 1, null))) CLERKS , sum(count(decode(job, 'SALESMAN', 1, null))) SALESMANS from emp group by job;
It returns the data as if the query were
Using only a single aggregate (count or sum) returns 1 row per job, as expectedselect sum(CLERKS), sum(SALESMANS) from (select count(decode(job, 'CLERK', 1, null)) CLERKS, count(decode(job, 'SALESMAN', 1, null)) SALESMANS from emp group by job)
John Stegeman wrote:
It returns the data as if the query wereselect sum(CLERKS), sum(SALESMANS) from (select count(decode(job, 'CLERK', 1, null)) CLERKS, count(decode(job, 'SALESMAN', 1, null)) SALESMANS from emp group by job)
Exactly the point ;-)
It seems that Oracle actually do, a group of 'double' in the same operation.
Attend plans to explain in this example:SQL> select count(decode(job, 'CLERK', 1, null)) CLERKS 2 , count(decode(job, 'SALESMAN', 1, null)) SALESMANS 3 from scott.emp group by job; CLERKS SALESMANS ---------- ---------- 0 0 0 0 0 0 0 4 4 0 Execution Plan ---------------------------------------------------------- Plan hash value: 1697595674 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 5 | 40 | 4 (25)| 00:00:01 | | 1 | HASH GROUP BY | | 5 | 40 | 4 (25)| 00:00:01 | | 2 | TABLE ACCESS FULL| EMP | 14 | 112 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------
And compare it to the one with the double aggregates:
SQL> select sum(count(decode(job, 'CLERK', 1, null))) CLERKS 2 , sum(count(decode(job, 'SALESMAN', 1, null))) SALESMANS 3 from scott.emp group by job; CLERKS SALESMANS ---------- ---------- 4 4 Execution Plan ---------------------------------------------------------- Plan hash value: 417468012 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 8 | 4 (25)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 8 | 4 (25)| 00:00:01 | | 2 | HASH GROUP BY | | 1 | 8 | 4 (25)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 14 | 112 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------
There are GROUP BY hash and SORT GLOBAL times.
It is really unnecessary to an aggregate on an aggregate - if two aggregates are used "in the same group level.
Sum() aggregates are used on an already aggregated value, so it doesn't look like Oracle which actually cures like 'first do the internal aggregate using the group specified by and then do the external aggregation on the result with any group.'Look at this example where I combine aggregates "double" with "single" aggregates:
SQL> select sum(count(decode(job, 'CLERK', 1, null))) CLERKS 2 , sum(count(decode(job, 'SALESMAN', 1, null))) SALESMANS 3 , count(decode(job, 'SALESMAN', 1, null)) SALESMANS2 4 , count(*) COUNTS 5 from scott.emp group by job; CLERKS SALESMANS SALESMANS2 COUNTS ---------- ---------- ---------- ---------- 4 4 1 5 Execution Plan ---------------------------------------------------------- Plan hash value: 417468012 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 8 | 4 (25)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 8 | 4 (25)| 00:00:01 | | 2 | HASH GROUP BY | | 1 | 8 | 4 (25)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 14 | 112 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------
When you mix "doubles" and "single" aggregates, Oracle decides that unique aggregates belong to the 'outer' aggregation
SALESMAN2 did a count on the aggregated work column which is the result of the 'internal' group by - so only 1.
The count (*) is also the result of the aggregation of the 'internal '.I don't know if it's documented or if it is an 'effect' of internal code used for GROUPING SETS or the internal code used to enable the analytical functions like this:
SQL> select count(decode(job, 'CLERK', 1, null)) CLERKS 2 , count(decode(job, 'SALESMAN', 1, null)) SALESMANS 3 , sum(count(decode(job, 'CLERK', 1, null))) over () CLERKS2 4 , sum(count(decode(job, 'SALESMAN', 1, null))) over () SALESMANS2 5 from scott.emp group by job; CLERKS SALESMANS CLERKS2 SALESMANS2 ---------- ---------- ---------- ---------- 0 0 4 4 4 0 4 4 0 0 4 4 0 0 4 4 0 4 4 4 Execution Plan ---------------------------------------------------------- Plan hash value: 4115955660 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 5 | 40 | 4 (25)| 00:00:01 | | 1 | WINDOW BUFFER | | 5 | 40 | 4 (25)| 00:00:01 | | 2 | SORT GROUP BY | | 5 | 40 | 4 (25)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 14 | 112 | 3 (0)| 00:00:01 | ----------------------------------------------------------------------------
Personally, I think that I would have preferred if Oracle has raised an error on this "double aggregation" and therefore require me to write this way (if it's the result I wanted):
select sum(CLERKS), sum(SALESMANS) from (select count(decode(job, 'CLERK', 1, null)) CLERKS, count(decode(job, 'SALESMAN', 1, null)) SALESMANS from emp group by job)
I don't really see a good use case for aggregations of 'double'-, but rather that he could give you undetected bugs in your code, if you happen to do double aggregation without noticing.
Interesting thing to know ;-)
-
einreihig subquery returns multiple rows
Hello
In the sub query, I get the error "ORA-01427: einreihig subquery returns more than one line. In this query below, I must also display only the bsr_ind_id from rm_cust where are.bsr_borr_ctg_id = '1' and also all cust_name and client_id
How can I modify this query?
Select cust_name
client_id
, (select bsr_ind_id from rm_cust r where are.bsr_borr_ctg_id = '1') as "SSB".
of rm_custI haven't used the pivotal enough to help with that without doing some research which I do not have time for this moment. But back to your original problem: there is obviously more than 1 line in rm_cust with bsr_borr_ctg_id = '1', so what one do you? You can guarantee that you will not get the error if you use:
select cust_name ,client_id ,(select max(bsr_ind_id) from rm_cust r where r.bsr_borr_ctg_id = '1') as "BSR" from rm_cust
Or you can use min max. Either avoid the error you get. If both give you the same result, then that is what you need. If they give different results, then you need to determine what (if) is correct.
-
Hello
I have the following table:
and the following procedure that queries the table:ID number, not null, unique fname varchar2(50),not null lname varchar2(50), not null email varchar2(200)not null, unique
When I run the procedure with just the immediate execution, the query returns a single id, but when I use select it in, I get the error "Fetch returns more rows". Why is this?declare name varchar2(100); email varchar2(500); stmt varchar2(4000); nbr number; begin name:=substr('sam wilkins:[email protected]',1,(instr('sam wilkins:[email protected]',':')-1)); email:=substr('sam wilkins:[email protected]',(instr('sam wilkins:[email protected]',':')+1)); stmt:='select id from tbl where ' || 'fname ||'' ''||' || 'lname='|| ''''||lower(name)||''''||' and email='||''''||lower(email)||''''||''; execute immediate stmt into nbr; select id into nbr from tbl where fname||' '||lname = name and email = email; dbms_output.put_line(stmt); dbms_output.put_line(nbr); end;
Thank you.Hello
natet wrote:
Hello
I have the following table:ID number, not null, unique fname varchar2(50),not null lname varchar2(50), not null email varchar2(200)not null, unique
and the following procedure that queries the table:
declare name varchar2(100); email varchar2(500); stmt varchar2(4000); nbr number; begin name:=substr('sam wilkins:[email protected]',1,(instr('sam wilkins:[email protected]',':')-1)); email:=substr('sam wilkins:[email protected]',(instr('sam wilkins:[email protected]',':')+1)); stmt:='select id from tbl where ' || 'fname ||'' ''||' || 'lname='|| ''''||lower(name)||''''||' and email='||''''||lower(email)||''''||''; execute immediate stmt into nbr; select id into nbr from tbl where fname||' '||lname = name and email = email; dbms_output.put_line(stmt); dbms_output.put_line(nbr); end;
When I run the procedure with just the immediate execution, the query returns a single id, but when I use select it in, I get the error "Fetch returns more rows". Why is this?
Thank you.
Give your local variable names that can be confused for column names.
In this statement:
select id into nbr from tbl where fname ||' '|| lname = name and email = email;
e-mail (in two places) refers to the column in the table. Probably, you want to use the local variable in place of one of them.
-
Attributes XML makes my query returns no rows
Hi all
I have a strange problem.
I ask an XML, but the attributes in one of the tags my query will return no rows. If I delete the attributes, the query works as expected.
The XML code is below; This is the Report tag attributes that cause problems:
My query is:<result errorCode="0"> <return> <Report xsi:schemaLocation="Items_x0020_status_x0020_information http://******-****/ReportServer?%2FReports%2FContent%20Producer%20Reports%2FItems%20status%20information&rs%3AFormat=xml&rc%3ASchema=True" Name="Items status information" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="Items_x0020_status_x0020_information"> <Tablix1> <Details_Collection> <Details ItemId="914P7" Username="test" user_role="IT" first_name="Barry" last_name="Donovan" organisation="" content_format="On_Screen" modified_date="26/05/2011 13:16:49" item_status="Draft" status_date="" component_name="" demand="" /> </Details_Collection> </Tablix1> </Report> </return> </result>
I tried to strip the attributes to the tag, which works, but some XML I look back are large enough (number of records), so that cause problems in itself. I would rather deal with it and don't mess with the XML itself if possible.select a.item_id ,a.username ,a.user_role ,a.first_name ,a.last_name ,a.supplier_id ,a.format ,a.modified_date ,a.item_status ,a.completion_date ,a.component_code from dual ,xmltable ('/result/return/Report/Tablix1/Details_Collection/Details' passing p_xml columns item_id varchar2(1000) path '@ItemId' ,username varchar2(1000) path '@Username' ,user_role varchar2(1000) path '@user_role' ,first_name varchar2(1000) path '@first_name' ,last_name varchar2(1000) path '@last_name' ,supplier_id varchar2(1000) path '@organisation' ,format varchar2(1000) path '@content_format' ,modified_date varchar2(1000) path '@modified_date' ,item_status varchar2(1000) path '@item_status' ,completion_date varchar2(1000) path '@status_date' ,component_code varchar2(1000) path '@demand' ) a;
Any help would be much appreciated!
Thank you much in advance.
Robin
Published by: User_resU on April 12, 2012 14:50The element of report and its children belong to a default namespace.
You have stated that in the request too:xmltable ( xmlnamespaces('Items_x0020_status_x0020_information' as "ns0"), '/result/return/ns0:Report/ns0:Tablix1/ns0:Details_Collection/ns0:Details' passing
-
SQL query returning no rows, please help!
I have a table that contains the user checks for a specific procedures alongwith the date stamp. Now, I want the list of all procedures that are not accessible by users in the last 6 months. Or, all of the procedures that have not been used/accessible during the last 6 months.
That's what I'm trying, but is does not return all rows:
SELECT DISTINCT proc_name,
TRUNC (entry_date)
OF log_web
WHERE NOT IN (SELECT proc_name proc_name
OF log_web
WHERE TRUNC (entry_date) > TRUNC (SYSDATE - 180))
ORDER BY DESC 2
Please notify.
Thank you in advance.Hello
NOT IN never returns TRUE if the subquery returns NULL values. If proc_name doesn't have a NOT NULL constraint, change the subquery to
WHERE proc_name NOT IN ( SELECT proc_name FROM log_web WHERE entry_date > TRUNC (SYSDATE - 180) AND proc_name IS NOT NULL )
I don't see any other suspect.
Post a small example of data (CREATE TABLE and INSERT statements) where the query produces results worng. -
Large type query returning no rows
Hello
Posted in right forum hope eth, I also posted this in SQl & PL/SQL which is not the right forum, I think.
I'm running a kind of large select query, counties of table is as shown below.
The lines are not returned which is quite impossible.
What could be the reason. Tablespace TEMP has run out or optimizer does not?
My Oracle version: 10 G R/2
I tried to update the statistics for each table, I am unable to check the TEMP tblspace as am not the ADMINISTRATOR.
COUNT (*) TABLE IS
--------------------------------------------------------------------------------
13047187
COUNT (*) TABLE B
--------------------------------------------------------------------------------
618194
COUNT (*) TABLE C
--------------------------------------------------------------------------------
18058
COUNT (*) TABLE D
--------------------------------------------------------------------------------
9
COUNT (*) TABLE E
--------------------------------------------------------------------------------
11813966
COUNT (*) TABLE F
--------------------------------------------------------------------------------
18093
COUNT (*) TABLE G
--------------------------------------------------------------------------------
13099
COUNT (*) TABLE:
--------------------------------------------------------------------------------
12000000
COUNT (*) TABLE I
--------------------------------------------------------------------------------
5285
Anyy help is appreciatedSeems to me that if the pid is different.
Select * from where a pid = "ACT714";<-- no="">-->
Select * from b where pid = "ACT714";<-- trailing="">-->Try
Select count (*) of a, b
where trim (a.pid) = trim (b.pid);If it works, you might want to consider how you store data, if they are supposed to be equal.
Check also if you compare with the data type varchar2, char data type.
I generally avoid the reasons char data type. -
Basically, I have two tables:
We have CUS_NO, AS_OF_DATE, AVG_AMT, CLOSING_BALANCE and DATE_JOINED
In this table, AVG_AMT is empty
Second table has CUS_NO, AS_OF_DATE and AVG_AMT
The average amt can be + ve - ve or both.
I do an update like this:
Update table1 set AVG_AMT = (select AVG_AMT from table2 where table1. CUS_NO = table2. CUS_NO)
With this, I get the error "single subquery returns more rows" which is just, because some customers have two EV - and + ve AVG_AMT
How would you advise me to tackle this problem?
For example: If Table1
CUS_NO DATE_JOINED CLOSING_BALANCE AS_OF_DATE AVG_AMT
123 10/10/09 12345 10/10/09 < NULL >
and the table2
CUS_NO AS_OF_DATE AVG_AMT
123 10/10/09 2000
123-10/10/09-400
The end result should be
CUS_NO DATE_JOINED CLOSING_BALANCE AS_OF_DATE AVG_AMT
123 10/10/09 12345 10 / 10 / 0 2000
123 10/10/09 12345 10/10/09-400Double Post.
Kind regards.
LOULOU.
Published by: Satyaki_De on November 19, 2009 17:35
Maybe you are looking for
-
I lost the power for the printer HP F4580 adapter. What I need to find? Thank you very much simonederouin
-
Screenshot of Xperia Z3 problem.
Hello world. I have a problem with my z3 otherwise perfect. Whenever I try to take a screenshot, I get a message saying that the operation succeeds in a pop-up notification but, there is no way I can find my screenshot anywhere... What should I do?
-
delay in response time when answering calls so that the screen is active (xperia z5)
When a click 'reply' during the screen is active, it fails the call as expected. It sometimes takes a few attempts. There is a known issue on Android 5.1.1 (Build number 32.0.A.6.200) Developer the activated options. See the option key is enabled. I
-
Provisioning configuration of extension error telepresence management suite
Dear Team Support Cisco I'm Tung, FROM Sun Media Corp. in Viet Nam I am using 6000 BE and install TMSPE on BE6K But during the installation, I have problem (attach file) "Process must leave before the requested information can be determined. I have u
-
Install a previously purchased Adobe Creative Suite 6 on my second Tablet (new)
HelloI bought Adobe Creative Suite 6 Design Standard on January 3, 2013 and installed it on my laptop.Now, I have a Tablet: Surface Pro 512 GB,.and I would have my Adobe programs on my tablet, too.Is it possible to install this product even on my Tab