Update or select in a single query
Hi , I want to select or update from a single query. Can I do that ?
I tried Merge into, but it is for Update or Insert.
Can anyone help me please. I do not want to use stored Proc/function.
userPrasad wrote:
I want to fire a update or merge statement inside a select SQL. Is there any way to do that ?Just to clarify:
It is possible to UPDATE based on a SELECT condition within SQL, i.e.,
UPDATE table1 t1
SET col1 = new_val
WHERE col2 IN (
SELECT col2
FROM table2 t2
WHERE t1.col1 = t2.col1
AND col1 = old_val);or to MERGE:
MERGE into table1 t1
USING (SELECT * FROM table2) t2
ON (t1.col1 = t2.col1)
WHEN MATCHED...
WHEN NOT MATCHED...Both of those will use a SELECT, and MERGE can UPDATE, INSERT, both or either one, or none.
Is that what you had in mind?
Similar Messages
-
How can I update the table with a single query for...
I have a table with columns C1 and C2.
C1 C2
A1 null
A1 null
A1 null
A1 null
A2 null
A2 null
A2 null
A3 null
A4 null
A4 null
I want to update my table with a single query so that I would have data like
C1 C2
A1 1
A1 2
A1 3
A1 4
A2 1
A2 2
A2 3
A3 1
A4 1
A4 2
The updated column C2 has the values like serial no grouped on the column C1.SQL> create table mytable
2 ( c1 varchar2(2)
3 , c2 number(2)
4 )
5 /
Tabel is aangemaakt.
SQL> insert into mytable (c1)
2 select 'A1' from dual union all
3 select 'A1' from dual union all
4 select 'A1' from dual union all
5 select 'A1' from dual union all
6 select 'A2' from dual union all
7 select 'A2' from dual union all
8 select 'A2' from dual union all
9 select 'A3' from dual union all
10 select 'A4' from dual union all
11 select 'A4' from dual
12 /
10 rijen zijn aangemaakt.
SQL> select * from mytable
2 /
C1 C2
A1
A1
A1
A1
A2
A2
A2
A3
A4
A4
10 rijen zijn geselecteerd.
SQL> merge into mytable t1
2 using (select c1
3 , row_number() over (partition by c1 order by null) rn
4 , rowid rid
5 from mytable
6 ) t2
7 on (t1.rowid = t2.rid)
8 when matched then
9 update set c2 = rn
10 when not matched then
11 insert values (null,null)
12 /
10 rijen zijn samengevoegd.
SQL> select * from mytable
2 /
C1 C2
A1 1
A1 2
A1 3
A1 4
A2 1
A2 2
A2 3
A3 1
A4 1
A4 2
10 rijen zijn geselecteerd.Regards,
Rob. -
Different selection in a single query according to an ID
Hi
I'm looking for a way to perform different selections in a single query according to a specific value:
Here is the first selection:
select g.*,gf.*,gs.*
FROM graphs g
LEFT JOIN graph_frames gf on g.graph_id = gf.graph_id
LEFT JOIN graph_sets gs on gf.frame_id = gs.frame_id
WHERE g.graph_id = :IDHere is the second selection:
SELECT gg.graph_id, gg.graph_name
FROM generic_graphs gg
INNER JOIN generic_graph_frames ggf on gg.graph_id = ggf.graph_id
INNER JOIN generic_graph_sets ggs on ggf.frame_id = ggs.frame_id
WHERE gg.graph_id = :IDNow, the ID cannot be in both the tables and I want to perform that in a single query, UNION cannot be applied since the tables are different.
Any ideas?
Edited by: BluShadow on 14-Sep-2011 09:09
added {noformat}{noformat} tags. Please read {message:id=9360002} and learn to do this yourself.Example of consolidating the columns...
SQL> ed
Wrote file afiedt.buf
1 with t as (select &id as id from dual)
2 select e.empno, e.ename, e.job, e.mgr, d.deptno, d.dname, d.loc
3 from (select * from emp cross join t where empno = t.id) e
4 full outer join
5 (select * from dept cross join t where deptno = t.id) d
6* on (1=1)
SQL> /
Enter value for id: 7521
old 1: with t as (select &id as id from dual)
new 1: with t as (select 7521 as id from dual)
EMPNO ENAME JOB MGR DEPTNO DNAME LOC
7521 WARD SALESMAN 7698
SQL> /
Enter value for id: 10
old 1: with t as (select &id as id from dual)
new 1: with t as (select 10 as id from dual)
EMPNO ENAME JOB MGR DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
SQL>Though, this would be considered poor design because you are trying to query two disperate things, so they should be treated differently. i.e. in my example, I should already know if I'm querying an employee or a department beforehand. -
Updating multiple node in a single query
Hi
Shall I update multiple nodes (which satisfies the given condition) in a single query? From the prototype we suspect that all nodes in all document are not updated in the container.
Version: BDB XML 2.4 - Fedora core 4 Linux - C++ language
Query:
replace value of node collection()/File[@Id="57565C01327A"]//Entry[@Class="Measurement" and @Id="0"]/Attribute[@Name="apDlBhUtil"]/@Value with 8'
Result:
XmlException occurred with msg 'Error: Sequence does not match type node() - the sequence contains more than one item [err:XUTY0008], <query>:1:1'
We have tried running the query in both Lazy and Eager evaluation type. Please clarify that the issue is with the query/execution type or BDB XML doesn't support this feature?
Thanks
SanthoshSanthosh,
Try:
for $i in collection()/File[@Id="57565C01327A"]//Entry[@Class="Measurement" and @Id="0"]/Attribute[@Name="apDlBhUtil"]/@Value return replace value of node $i with 8'The problem with your original is that the argument for "replace value of" needs to be a single item, not a sequence.
Regards,
George -
Updating two table from a single query
I have two table such as
user_log(user_id , password)
and
user_info(user_id , name , age , address , sex , email , contact)
If I want to add data from a single form in php then what is the query?Hi,
welcome to the forum..! plesae always post table data and expected result to help forum members help you better.
From what I understand, all you need is a join on userid (assuming userid is unique/primary key )
select ul.userid,
ul.password,
ui.name,
ui.age
from user_log ul,
user_info ui
where ul.user_id = ui.user_id
---- and any otehr condition for the user that you need.(where clause)In PHP......(based on this link.. http://wiki.oracle.com/page/PHP+Oracle+FAQ
haven't tested the code.. )
<?php
$conn = oci_connect("scott", "tiger", "localhost/XE");
if (!$conn) {
$m = oci_error();
echo $m["message"];
exit;
$stid = oci_parse($conn, "select ul.userid,
ul.password,
ui.name,
ui.age
from user_log ul,
user_info ui
where ul.user_id = ui.user_id");
oci_execute($stid);
// Query the table
echo "<table border='1'>";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>";
foreach ($row as $item) {
echo "<td>".($item!==null?htmlentities($item):" ")."</td>";
echo "</tr>".PHP_EOL;
echo "</table>";
oci_free_statement($stid);
oci_close($conn);
?>Try to provide more details.. if this is not what you are looking for.
Hope this helps,
Rajesh. -
Update table all null values to 0 single query
hi dear ;
How Can I do , update table all null values to 0 using single query or proceduredeclare @tableName nvarchar(100)
declare @querys varchar(max)
set @querys = ''
set @tableName = 'YOUR TABLE NAME HERE'
select @querys = @querys + 'update ' + @tableName + ' set ' +
QUOTENAME(t.[name]) + '=0 where ' + QUOTENAME(t.[name]) + ' is null;'
from (SELECT [name] FROM syscolumns
WHERE id = (SELECT id
FROM sysobjects
WHERE type = 'U'
AND [NAME] = @tableName))t
select @querys
execute sp_executesql @sqlQuery
Reference:
http://stackoverflow.com/questions/6130133/sql-server-update-all-null-field-as-0
-Vaibhav Chaudhari
this code is return update TABLE set [FIELD]=isnull([FIELD],''),update TABLE set [FIELD2]=isnull([FIELD2],'')
I want to use UPDATE TABLE SET FIELD1=ISNULL(FIELD1,0),FIELD2=ISNULL(FIELD2,0),FIELD3=ISNULL(FIELD3,0) So CUT another update and set statement . -
In a procedure I have a CURSOR FOR_LOOP
FOR CUR_CONTO in
(SELECT TO_NUMBER(lpad(nvl(ltrim(K_DRG),'0'),3,'0') ) K_DRG,
CASE
WHEN K_MDC = 'NA' THEN 0
WHEN K_MDC <> 'NA' THEN TO_NUMBER( lpad(nvl(ltrim(K_MDC),'0'),2,'0') )
END K_MDC,
TO_NUMBER(substr(PAZIENTE, instr(PAZIENTE,'@')+1, 4) ) KCODET,
substr(PAZIENTE, instr(PAZIENTE,'@')+5, 1) TIPORDT,
TO_NUMBER(SUBSTR(N_CCLINICA,1,4) ) ANNOT
FROM table_g)
LOOP
UPDATE table_dm SET K_DRG = CUR_CONTO.K_DRG , K_MDC = NVL(CUR_CONTO.K_MDC,0)
WHERE K_CODE = CUR_CONTO.KCODET
AND TIPORD = CUR_CONTO.TIPORDT
AND ANNO = CUR_CONTO.ANNOT ;
end LOOP;
I want change it in a single query, how can I do?
I write
UPDATE table_dm SET K_DRG , K_MDC =
(SELECT TO_NUMBER(lpad(nvl(ltrim(K_DRG),'0'),3,'0') ) K_DRG,
CASE
WHEN K_MDC = 'NA' THEN 0
WHEN K_MDC <> 'NA' THEN TO_NUMBER( lpad(nvl(ltrim(K_MDC),'0'),2,'0') )
END K_MDC FROM table_g )
but I don't know how insert in the where the variable KCODET, TIPORDT ,ANNOT get from table table_g
WHERE K_CODE = CUR_CONTO.KCODET
AND TIPORD = CUR_CONTO.TIPORDT
AND ANNO = CUR_CONTO.ANNOT ;
And How can I lock table_dm because it has some trigger in updating?
Thanks in advanceIt should be something like this
UPDATE table_dm dm
SET (K_DRG, K_MDC) = (
SELECT k_drg, NVL(k_mdc,0)
FROM (SELECT TO_NUMBER(lpad(nvl(ltrim(K_DRG),'0'),3,'0') ) k_drg,
CASE
WHEN k_mdc = 'NA' THEN 0
WHEN k_mdc != 'NA' THEN TO_NUMBER( lpad(nvl(ltrim(k_mdc),'0'),2,'0'))
END k_mdc,
TO_NUMBER(substr(paziente, instr(paziente,'@')+1, 4)) kcodet,
substr(paziente, instr(paziente,'@')+5, 1) tipordt,
TO_NUMBER(SUBSTR(n_cclinica,1,4)) annot
FROM table_g) t
WHERE t.kcodet = dm.k_code
AND t.tipordt = dm.tipord
AND t.annot = dm.annot
WHERE EXISTS (
SELECT null
FROM (SELECT TO_NUMBER(lpad(nvl(ltrim(K_DRG),'0'),3,'0') ) k_drg,
CASE
WHEN k_mdc = 'NA' THEN 0
WHEN k_mdc != 'NA' THEN TO_NUMBER( lpad(nvl(ltrim(k_mdc),'0'),2,'0'))
END k_mdc,
TO_NUMBER(substr(paziente, instr(paziente,'@')+1, 4)) kcodet,
substr(paziente, instr(paziente,'@')+5, 1) tipordt,
TO_NUMBER(SUBSTR(n_cclinica,1,4)) annot
FROM table_g) t
WHERE t.kcodet = dm.k_code
AND t.tipordt = dm.tipord
AND t.annot = dm.annot
)Note: Code not tested -
All selected 'n' consecutive rows in retrieved in a single query
hello,
I have table T with 50,000 rows
create table T
(student_id number,
class_id number,
quiz_id number,
marks number)
some sample rows like
INSERT INTO T VALUES (1,1, 1, 50);
INSERT INTO T VALUES (2,2, 2, 40);
INSERT INTO T VALUES (3,1, 3, 34);
INSERT INTO T VALUES (1,1, 4, 10);
INSERT INTO T VALUES (1,1, 5, 30);
INSERT INTO T VALUES (1,1, 6, 29);
INSERT INTO T VALUES (3,2, 7, 34);
INSERT INTO T VALUES (3,2, 8, 33);
INSERT INTO T VALUES (3,2, 9, 56);
INSERT INTO T VALUES (1,1, 7, 90);
INSERT INTO T VALUES (2,2, 8, 0,);
INSERT INTO T VALUES (1,1, 8, 80);
INSERT INTO T VALUES (2,2, 8, 65);
INSERT INTO T VALUES (1,1, 9, 34);
INSERT INTO T VALUES (2,2, 9, 11);each student belongs to one class_id. each student participates in many quizes. each quiz has its unique id. each student can appear once in a quiz_id
I am doing the below analysis and query:
1. with below query I am finding which student_id had most marks in any 3 successive quizes (see the 3-1 part below) in the query..
SELECT QUIZ_ID,
STUDENT_ID,
SUM (MARKS) OVER (PARTITION BY STUDENT_ID ORDER BY QUIZ_ID1
RANGE BETWEEN CURRENT ROW AND (3-1) FOLLOWING) consecMARKS , MARKS FROM
(SELECT QUIZ_ID,
STUDENT_ID,
MARKS,
ROW_NUMBER() OVER (PARTITION BY STUDENT_ID ORDER BY T.QUIZ_ID) QUIZ_ID1
FROM T
WHERE MARKS IS NOT NULL
ORDER BY 1
ORDER BY 3 DESC
SQL> /
QUIZ_ID STUDENT_ID CONSECMARKS
7 1 170
6 1 166
8 1 129
5 1 106
8 3 89
8 2 76
3 3 68
7 3 67
8 2 65
1 1 60
9 3 56
QUIZ_ID STUDENT_ID CONSECMARKS
9 1 49
2 2 40
4 1 40
9 2 11
15 rows selected.With above query, I can play around and find for any 'n' number of consecutive quizes, like marks in 2 consecutives quizes, 3, 4 and so on but for each 'n' value I've to run a seperate query mentioning (2-1) or (3-1) or (4-1) and so on..
since my table is big and there are about 400 quizes so what I want to find out is for each 'n' consecutive quiz (from 1 to 400) which student had most marks for each consecutie 'n' quiz. Like in 1 (consecutive) quiz which student had the highest marks and then 2 conseuctive quiz who had most marks and then in 3 consecutive quiz who had most marks and so on till 400 consecutive quiz who had most marks... rather than running query for each 'n' value seperately i want a single query that can give me a summary of most marks in each n consecutive quizes...
my sample output is:
Nth consecutive quiz student_id sum(marks)
1 1 90
2 1 170
3 1 246
4
100
200
300
400 ? ? Is this possible to get the above output from one single query? If there are two or more students with equal most marks for any 'n' conseutive quizes then both should come in the summary.
Hope I have been able to put up my question clearly.
regards
RamisSomething like:
SELECT N,
QUIZ_ID,
STUDENT_ID,
SUM(MARKS) OVER (PARTITION BY N,STUDENT_ID ORDER BY QUIZ_ID1 RANGE BETWEEN CURRENT ROW AND (N-1) FOLLOWING) consecMARKS,
MARKS
FROM (SELECT QUIZ_ID,
STUDENT_ID,
MARKS,
ROW_NUMBER() OVER (PARTITION BY STUDENT_ID ORDER BY T.QUIZ_ID) QUIZ_ID1
FROM T
WHERE MARKS IS NOT NULL
SELECT LEVEL N
FROM DUAL
CONNECT BY LEVEL <= (
SELECT COUNT(DISTINCT QUIZ_ID)
FROM T
ORDER BY N,
consecMARKS DESC
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
1 7 1 90 90
1 8 1 80 80
1 8 2 65 65
1 9 3 56 56
1 1 1 50 50
1 2 2 40 40
1 9 1 34 34
1 7 3 34 34
1 3 3 34 34
1 8 3 33 33
1 5 1 30 30
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
1 6 1 29 29
1 9 2 11 11
1 4 1 10 10
1 8 2 0 0
2 7 1 170 90
2 6 1 119 29
2 8 1 114 80
2 8 3 89 33
2 8 2 76 65
2 3 3 68 34
2 7 3 67 34
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
2 8 2 65 0
2 1 1 60 50
2 5 1 59 30
2 9 3 56 56
2 2 2 40 40
2 4 1 40 10
2 9 1 34 34
2 9 2 11 11
3 7 1 204 90
3 6 1 199 29
3 5 1 149 30
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
3 7 3 123 34
3 8 1 114 80
3 2 2 105 40
3 3 3 101 34
3 1 1 90 50
3 8 3 89 33
3 8 2 76 65
3 8 2 76 0
3 4 1 69 10
3 9 3 56 56
3 9 1 34 34
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
3 9 2 11 11
4 6 1 233 29
4 5 1 229 30
4 7 1 204 90
4 4 1 159 10
4 3 3 157 34
4 7 3 123 34
4 1 1 119 50
4 2 2 116 40
4 8 1 114 80
4 8 3 89 33
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
4 8 2 76 0
4 8 2 76 65
4 9 3 56 56
4 9 1 34 34
4 9 2 11 11
5 5 1 263 30
5 4 1 239 10
5 6 1 233 29
5 1 1 209 50
5 7 1 204 90
5 3 3 157 34
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
5 7 3 123 34
5 2 2 116 40
5 8 1 114 80
5 8 3 89 33
5 8 2 76 0
5 8 2 76 65
5 9 3 56 56
5 9 1 34 34
5 9 2 11 11
6 1 1 289 50
6 4 1 273 10
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
6 5 1 263 30
6 6 1 233 29
6 7 1 204 90
6 3 3 157 34
6 7 3 123 34
6 2 2 116 40
6 8 1 114 80
6 8 3 89 33
6 8 2 76 0
6 8 2 76 65
6 9 3 56 56
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
6 9 1 34 34
6 9 2 11 11
7 1 1 323 50
7 4 1 273 10
7 5 1 263 30
7 6 1 233 29
7 7 1 204 90
7 3 3 157 34
7 7 3 123 34
7 2 2 116 40
7 8 1 114 80
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
7 8 3 89 33
7 8 2 76 0
7 8 2 76 65
7 9 3 56 56
7 9 1 34 34
7 9 2 11 11
8 1 1 323 50
8 4 1 273 10
8 5 1 263 30
8 6 1 233 29
8 7 1 204 90
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
8 3 3 157 34
8 7 3 123 34
8 2 2 116 40
8 8 1 114 80
8 8 3 89 33
8 8 2 76 0
8 8 2 76 65
8 9 3 56 56
8 9 1 34 34
8 9 2 11 11
9 1 1 323 50
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
9 4 1 273 10
9 5 1 263 30
9 6 1 233 29
9 7 1 204 90
9 3 3 157 34
9 7 3 123 34
9 2 2 116 40
9 8 1 114 80
9 8 3 89 33
9 8 2 76 0
9 8 2 76 65
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
9 9 3 56 56
9 9 1 34 34
9 9 2 11 11
135 rows selected.
SQL> SY. -
Selecting data from single table with different condition in single query
Hi everybody...
I have one table with col1, col2, col3, col4, col5... as columns.
I want to select col1, col2, col3 with condition (x=y and a=b and c=d)
I want to select col4, col5 with condition (x=y and a=b and m=n )
in single query...
Thanx for ur helpGiven this data set...
SQL> select * from oddity
2 /
COL1 COL2 COL3 COL4 COL5 A X C M
1 2 3 4 5 B Y M
1 2 3 4 5 A Y C N
1 2 3 4 5 A Y D M
1 2 3 4 5 A Y D N
1 2 3 4 5 B Y D N
1 2 3 4 5 B Y D U
6 rows selected.
SQL>The following query meets the requirements. Of course, the requirements as stated are incomplete. I ahave assumed that we select all five columns if C=D andM=N.
SQL> SELECT decode(c, 'D', col1, '0') AS col1
2 , decode(c, 'D', col2, '0') AS col2
3 , decode(c, 'D', col3, '0') AS col3
4 , decode(m, 'N', col4, '-8') AS col4
5 , decode(m, 'N', col5, '-8') AS col5
6 FROM oddity
7 WHERE a = 'B'
8 AND x = 'Y'
9 /
COL1 COL2 COL3 COL4 COL5
0 0 0 -8 -8
1 2 3 4 5
1 2 3 -8 -8
SQL> Cheers, APC -
Select top row in Single Query?
Hi
Can somebody help me to write a query to get the first row after order by clause using single query alone.
Example:
I can write following query to select first row
select * from (selec * from t order by col1) where rownum = 1;
But here I should not use inline view to get the result. Because my original requirement needs to use this query in select list and it needs to use a column (of a table from the FROM clause) in the where clause of inline query. Because there is restriction that we can not use the column (of a table from the FROM clause) more than one level of inline query.
Please help me.Raghav.786 wrote:
Hi
Can somebody help me to write a query to get the first row after order by clause using single query alone.
Example:
I can write following query to select first row
select * from (selec * from t order by col1) where rownum = 1;
But here I should not use inline view to get the result. Because my original requirement needs to use this query in select list and it needs to use a column (of a table from the FROM clause) in the where clause of inline query. Because there is restriction that we can not use the column (of a table from the FROM clause) more than one level of inline query.
Please help me.
What Oracle version are you?
If you have 12c you can use
select col1,...
from t
order by col1
fetch first 1 row only;
If less than 12c, you have can't do it without a subquery.
What are you actually trying to do? Read Re: 2. How do I ask a question on the forums?
and follow the advice there by giving example create table and insert sample data statements and
explaining clearly what you are trying to do. Then we can help more. -
Select single query working unexpectedly
Hi all,
I have used below select single * query as shown :
I have data in my table S022 as shown below, it has 2 records for material and aufnr combination :
WERKS ARBPL kapar MATNR AUFNR
w1 ar1 004 mat1 000300156789
w1 ar2 mat1 000300156789
The code used :
select single *
from s022
where werks = itab-ltap-werks "w1
and matnr = w_matnr "mat1
and aufnr = w_aufnr. " 000300156789
runtime select query is picking second record i.e of ar2.
I hope it should have picked ar1 record but its doesnt .
Also sometimes it picks 1st record for different data and for this data it picks the second record.
Kindly help me to explain why its not picking the first record.
Regards.ujjwal_d15 wrote:
It is as per the data in the table . The records are one below the another in database table.
> So i feel it should have picked the first record.
Hello Ujjwal,
The records shown in the databrowser is a snapshot of the entries in the DB & not how the recs are actually stored!
In RDBMS the sequence of entries is not defined at the DB layer. In SELECT SINGLE the 1st rec to be hit is returned to the result set. In your case this is the 2nd rec.
BR,
Suhas -
Update several rows with single query (easy question, I guess)
Hi all!
I have table with two columns - name and value.
I populate it with several sql queries:
insert into settings (name, value) values ('company_name', 'My Company');
insert into settings (name, value) values ('company_address', 'Company Address 12');
insert into settings (name, value) values ('company_city', 'South Park');
How can update rows with company_name and company_city in single query?
Thank you in advance!How can update rows with company_name and company_city in single query?I guess something like this was meant:
update settings set value = ??? where name in ('company_name ', 'company_city');But it's still unclear to me what should be used instead of question marks... :)
Regards. -
Single Query for getting total no of records N getting records from a selected range
Hi,
Got the below query:
SELECT a.*, rowid FROM (SELECT name, postcode FROM Tbl ORDER BY name asc)a WHERE ROWNUM <=30
MINUS
SELECT b.*, rowid FROM (SELECT name, postcode FROM Tbl ORDER BY name asc) b WHERE ROWNUM <= 10
Though I got the results right, I also want to know the total no of records from "SELECT name, postcode FROM Tbl ORDER BY name asc". Does anyone knows how to do it in a single query?
Thanks.hi Carol
The following output may help you.
SQL> l
1 select * from emp where (rowid,0) in (select rowid,mod(rownum,10)-rownum from emp)
2 minus
3* select * from emp where (rowid,0) in (select rowid,mod(rownum,6)-rownum from emp)
SQL> /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
The above query fetches the 6,7,8,9th records only.
Well my suggestion would be not to use ROWNUM directly in where clause since it changes dynamically. it is not a fixed value. for example pls see the result.
SQL> select rownum,empno,ename,sal,job from emp where sal > 3000;
ROWNUM EMPNO ENAME SAL JOB
1 7839 KING 5000 PRESIDENT
SQL> select rownum,empno,ename,sal,job from emp where sal > 1000;
ROWNUM EMPNO ENAME SAL JOB
1 7566 JONES 2975 MANAGER
2 7654 MARTIN 1250 SALESMAN
3 7698 BLAKE 2850 MANAGER
4 7782 CLARK 2450 MANAGER
5 7788 SCOTT 3000 ANALYST
6 7839 KING 5000 PRESIDENT
7 7844 TURNER 1500 SALESMAN
8 7876 ADAMS 1100 CLERK
9 7902 FORD 3000 ANALYST
10 7934 MILLER 1300 CLERK
10 rows selected.
SQL> select * from emp where rownum = 1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7566 JONES MANAGER 7839 02-APR-81 2975 20
The record of employee KING is getting the rownum differently.
My understanding (out of my little knowledge) is the rownum values are assigned to the records only after the records are read physically and after applying the conditions(without rownum). Then the row numbers (rownum) is assigned to the records. Hence the rownum is not constant to a record since it is a dynamic value.
Well i would like to know the suggestions of the ORACLE EXPERTS here in the discussion forum.
If my finding is correct then OK if not Pls excuse me and pls give the correct solution
Regards
Prakash Eranki
[email protected] -
Combine two queries to Update a table in single query.
I need to update a table in a stored procedure in following manner:
IF p_status = 'FAILED' THEN
UPDATE pms_table
SET status = p_status
WHERE quote_id = p_quote_id
IF p_status = 'COMPLETED' THEN
UPDATE pms_table
SET status = p_status
WHERE quote_id = p_quote_id
How to combine above two queried in single query having same fuctionality.
Regards,
AgrawalVUPDATE pms_table
SET status = p_status
WHERE quote_id = p_quote_id
and p_status in ('FAILED','COMPLETED'); -
How to calculate the area of a large number of polygons in a single query
Hi forum
Is it possible to calculate the area of a large number of polygons in a single query using a combination of SDO_AGGR_UNION and SDO_AREA? So far, I have tried doing something similar to this:
select sdo_geom.sdo_area((
select sdo_aggr_union ( sdoaggrtype(mg.geoloc, 0.005))
from mapv_gravsted_00182 mg
where mg.dblink = 521 or mg.dblink = 94 or mg.dblink = 38 <many many more....>),
0.0005) calc_area from dualThe table MAPV_GRAVSTED_00182 contains 2 fields - geoloc (SDO_GEOMETRY) and dblink (Id field) needed for querying specific polygons.
As far as I can see, I need to first somehow get a single SDO_GEOMETRY object and use this as input for the SDO_AREA function. But I'm not 100% sure, that I'm doing this the right way. This query is very inefficient, and sometimes fails with strange errors like "No more data to read from socket" when executed from SQL Developer. I even tried with the latest JDBC driver from Oracle without much difference.
Would a better approach be to write some kind of stored procedure, that adds up all the single geometries by adding each call to SDO_AREA on each single geometry object - or what is the best approach?
Any advice would be appreciated.
Thanks in advance,
JacobHi
I am now trying to update all my spatial table with SRID's. To do this, I try to drop the spatial index first to recreate it after the update. But for a lot of tables I can't drop the spatial index. Whenever I try to DROP INDEX <spatial index name>, I get this error - anyone know what this means?
Thanks,
Jacob
Error starting at line 2 in command:
drop index BSSYS.STIER_00182_SX
Error report:
SQL Error: ORA-29856: error occurred in the execution of ODCIINDEXDROP routine
ORA-13249: Error in Spatial index: cannot drop sequence BSSYS.MDRS_1424B$
ORA-13249: Stmt-Execute Failure: DROP SEQUENCE BSSYS.MDRS_1424B$
ORA-29400: data cartridge error
ORA-02289: sequence does not exist
ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 27
29856. 00000 - "error occurred in the execution of ODCIINDEXDROP routine"
*Cause: Failed to successfully execute the ODCIIndexDrop routine.
*Action: Check to see if the routine has been coded correctly.
Edit - just found the answer for this in MetaLink note 241003.1. Apparently there is some internal problem when dropping spatial indexes, some objects gets dropped that shouldn't be. Solution is to manually create the sequence it complains it can't drop, then it works... Weird error.
Maybe you are looking for
-
Unit of measure ST is not defined as a commercial unit
Hi Experts, While doing Punch Out catalogue in the Maintenance Order, i have received the following error "Unit of measure ST is not defined as a commercial unit". I have checked in the transaction CUNI, and ensure that the above UoM is maintained. T
-
I can't create an icolud account
I tried to setup icloud on my PC and when i'm trying to log into icloud to the control panel it writes: the apple ID is valid but it's not an icloud account
-
Problem in synchronizing two executions
One execution (not in loop structure) is to run vi-A to move a motor by certain distance. Another execution is a loop struction, and in each loop execution vi-B inside it acquires current motor position. I hope to synchronize this two executions so t
-
Completion date for notification, IW22
when i tried to set the completion date for a notification through IW22 am not able to view the completion date and completion time inputs in the popup screen, only reference date and reference time is showing can this be due any status set to that n
-
Print .PDT,.DOC,.XLS files using java print API
Hi, I need to print different types of documents like pdf, word, excel files etc. Please let me know how to proceed on this. I tried using the following code, but it is printing all junk/html tags on the paper. Please let me know how to resolve this.