Cdc- deletion of parent- child records
Hi,
I am working with CDC-consistent feature in odi.
Here my scenario is, I have a record say 120 (primary key) in table A(parent source table) and it is used as a foreign key in Table B.
both child and parent are inserted into the concerned tables of target.
Now i want to delete this 120 record from target parent and child tables.
IN the pkg i arranged the pkg scenarios as follows
odiwaitforlogdata----->source model(with extenwindow and lock subscriber option selected)------>parent pkg scenario------>child pkg scenario----->source mode(with unlock subscriber and purge journal options). ------------> This works fine for insert and update.
odiwaitforlogdata----->source model(with extenwindow and lock subscriber option selected)------>child pkg scenario--------->parent pkg scenario----->source mode(with unlock subscriber and purge journal options). ------------> This works fine for delete.
Can't I achieve these two in one pkg
Please Guide.
Regards,
Chaitanya.
Hi,
kev374 wrote:
Thanks, one question...
I did a test and it seems the child rows have to also satisfy the parent row's where clause, take this example:
EVENT_ID|PARENT_EVENT_ID|CREATED_DATE
2438 | (null) | April 9 2013
2439 | 2438 | April 11 2013
2440 | 2438 | April 11 2013
select * from EVENTS where CREATED_DATE < sysdate - 9
start with EVENT_ID = 2438
connect by PARENT_EVENT_ID = prior EVENT_IDSo you've changed the condition about only wanting roots and their children, and now you want descendants at all levels.
This pulls in record #2438 (per the sysdate - 9 condition) but 2439 and 2440 are not connected. Is there a way to supress the where clause evaluation for the child records? I just want to pull ALL child records associated with the parent and only want to do the date check on the parent.Since the roots (the only rows you want to exclude) have LEVEL=1, you can get the results you requested like this:
WHERE created_date < SYSDATE - 9
OR LEVEL > 1However, since you're not ruling out the grandchildren and great-grandchildren any more, why wouldn't you just say:
SELECT *
FROM events
WHERE created_date < SYSDATE - 9
OR parent_event_id IS NOT NULL;?
CONNECT BY is slow. Don't use it if you don't need it.
If you x-reference my original query:
select * from EVENTS where CREATED_DATE < sysdate - 90 and PARENT_EVENT_ID is null -- All parents
union
select * from EVENTS where PARENT_EVENT_ID in (select EVENT_ID from EVENTS where CREATED_DATE < sysdate - 90 and PARENT_EVENT_ID is null) -- include any children of parents selected from above
The 2nd select does not apply the created_date < sysdate - 90 on the children but rather pulls in all related children :)Sorry; my mistake. That's what happens when you don't post sample data, and desired results; people can't test their solutions and find mistakes like that.
Similar Messages
-
Parent/child records from same table
I want to create a query that is a union such that the 2nd resultset is based on the 1st resultset. I have a table that has parent/child records in the same table.
Table: EVENTS
EVENT_ID
PARENT_EVENT_ID
CREATED_DATE
(other columns)
if PARENT_EVENT_ID is null then it is a parent record, else it is a child record. I want to select all parent records then union them with all the associated child records...something like this:
select * from EVENTS where CREATED_DATE < sysdate - 90 and PARENT_EVENT_ID is null -- All parents
union
select * from EVENTS where PARENT_EVENT_ID in (select EVENT_ID from EVENTS where CREATED_DATE < sysdate - 90 and PARENT_EVENT_ID is null) -- include any children of parents selected from above
This works but it's kind of ugly, I want to avoid using the sub-select in the 2nd because it is a repeat of the 1st statement, is there a way to alias the first statement and just refer to it in the 2nd query?Hi,
kev374 wrote:
Thanks, one question...
I did a test and it seems the child rows have to also satisfy the parent row's where clause, take this example:
EVENT_ID|PARENT_EVENT_ID|CREATED_DATE
2438 | (null) | April 9 2013
2439 | 2438 | April 11 2013
2440 | 2438 | April 11 2013
select * from EVENTS where CREATED_DATE < sysdate - 9
start with EVENT_ID = 2438
connect by PARENT_EVENT_ID = prior EVENT_IDSo you've changed the condition about only wanting roots and their children, and now you want descendants at all levels.
This pulls in record #2438 (per the sysdate - 9 condition) but 2439 and 2440 are not connected. Is there a way to supress the where clause evaluation for the child records? I just want to pull ALL child records associated with the parent and only want to do the date check on the parent.Since the roots (the only rows you want to exclude) have LEVEL=1, you can get the results you requested like this:
WHERE created_date < SYSDATE - 9
OR LEVEL > 1However, since you're not ruling out the grandchildren and great-grandchildren any more, why wouldn't you just say:
SELECT *
FROM events
WHERE created_date < SYSDATE - 9
OR parent_event_id IS NOT NULL;?
CONNECT BY is slow. Don't use it if you don't need it.
If you x-reference my original query:
select * from EVENTS where CREATED_DATE < sysdate - 90 and PARENT_EVENT_ID is null -- All parents
union
select * from EVENTS where PARENT_EVENT_ID in (select EVENT_ID from EVENTS where CREATED_DATE < sysdate - 90 and PARENT_EVENT_ID is null) -- include any children of parents selected from above
The 2nd select does not apply the created_date < sysdate - 90 on the children but rather pulls in all related children :)Sorry; my mistake. That's what happens when you don't post sample data, and desired results; people can't test their solutions and find mistakes like that. -
Inserting parent /child records from a xml file ...
XML file pasted below:
I have loaded the xml file into a table called xml_demo which has a column xml_data of type xmltype.
The select for parent record is as follows and it works:
INSERT INTO balit_submissions (balitdoc, documentversion, datetime_from,job_id, status,creation_datetime)
(SELECT 'MOL'
,to_number(extract(x.xml_data,'/MolDocument/DocumentVersion/@v'))
,to_date(substr(extract(x.xml_data,'/MolDocument/ValidTimeInterval/@v'),1,16),
'yyyy-mm-dd"T"hh24:mi')
,123456
,'CREATED',
NULL
FROM xml_DEMO x WHERE
existsnode(x.xml_data,'/MolDocument/DocumentIdentification[@v="MOL_20100331_1500_1600"]') = 1)
Having problem creating child records. From this file I expect to create 3 records.
insert into balit_energy_blocks
SO_ID,
DATETIME_FROM,
DIRECTION,
BLOCK_NUMBER,
ENERGY,
LAST_SUBMIT_DATETIME,
PRICE_POUNDS,
PRICE_EUROS,
BALIT_REF,
STATUS,
LAST_EDIT_DATETIME,
MOL_REASON,
ACQUIRING_SO_AREA)
(SELECT 'RTE'
,to_date(substr(extract(x.xml_data,'/MolDocument/ValidTimeInterval/@v'),1,16),
'yyyy-mm-dd"T"hh24:mi')
,DECODE(extract(x.xml_data,'/MolDocument/MolTimeSeries/Direction/@v'),'AO1','Up','Down')
,to_number(substr(extract(x.xml_data,'/MolDocument/MolTimeSeries/ContractIdentification/@v'),19))
,to_number(extract(x.xml_data,'/MolDocument/MolTimeSeries/Period/Interval/EnergyPrice/@v'))
,sysdate
,null -- price pounds
,null -- price euro
,extract(x.xml_data,'/MolDocument/MolTimeSeries/ContractIdentification/@v')
,'SUBMITTED'
,'A96'
,NULL -- acquiring area
,sysdate
FROM xml_DEMO x WHERE
existsnode(x.xml_data,'/MolDocument/DocumentIdentification[@v="MOL_20100331_1500_1600"]') = 1)
For example, there are 3 ContractIdentification tags. Example of 1:
<ContractIdentification v="RTE_20100331_1500_16"/>
I was expecting this select to pluck the last number from this string. In this case 16.
The select was:
to_number(substr(extract(x.xml_data,'/MolDocument/MolTimeSeries/ContractIdentification/@v'),19))
The result I got was:
16RTE_20100331_1500_20NG_20100331_1500_6
All contractident values are concatnated and returns from position 19 onwards.
Can anyone help me to extract the last number from each ContractIdentification tag value and to create the 3 records
Thanks
James Sathiaraj
<?xml version="1.0" encoding="UTF-8"?>
<MolDocument DtdVersion="3" DtdRelease="0">
<DocumentIdentification v="MOL_20100331_1500_1600"/>
<DocumentVersion v="1"/>
<DocumentType v="A43"/>
<SenderIdentification codingScheme="A01" v="17X100Z100Z0001H"/>
<SenderRole v="A35"/>
<ReceiverIdentification codingScheme="A01" v="10XFR-RTE------Q"/>
<ReceiverRole v="A04"/>
<CreationDateTime v="2010-03-31T14:10:00Z"/>
<ValidTimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<Domain codingScheme="A01" v="10YDOM-1001A001A"/>
<MolTimeSeries>
<ContractIdentification v="RTE_20100331_1500_16"/>
<ResourceProvider codingScheme="A01" v="10XFR-RTE------Q"/>
<AcquiringArea codingScheme="A01" v="17Y100Z100Z00013"/>
<ConnectingArea codingScheme="A01" v="10YFR-RTE------C"/>
<AuctionIdentification v="AUCTION_20100331_1500_1600"/>
<BusinessType v="A10"/>
<BidTimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<MeasureUnitQuantity v="MAW"/>
<Currency v="EUR"/>
<MeasureUnitPrice v="MWH"/>
<Direction v="A02"/>
<MinimumActivationQuantity v="50"/>
<Status v="A06"/>
<Period>
<TimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<Resolution v="PT60M"/>
<Interval>
<Pos v="1"/>
<Qty v="50"/>
<EnergyPrice v="50.45"/>
</Interval>
</Period>
</MolTimeSeries>
<MolTimeSeries>
<ContractIdentification v="RTE_20100331_1500_20"/>
<ResourceProvider codingScheme="A01" v="10XFR-RTE------Q"/>
<AcquiringArea codingScheme="A01" v="17Y100Z100Z00013"/>
<ConnectingArea codingScheme="A01" v="10YFR-RTE------C"/>
<AuctionIdentification v="AUCTION_20100331_1500_1600"/>
<BusinessType v="A10"/>
<BidTimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<MeasureUnitQuantity v="MAW"/>
<Currency v="EUR"/>
<MeasureUnitPrice v="MWH"/>
<Direction v="A02"/>
<MinimumActivationQuantity v="50"/>
<Status v="A06"/>
<Period>
<TimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<Resolution v="PT60M"/>
<Interval>
<Pos v="1"/>
<Qty v="50"/>
<EnergyPrice v="50.48"/>
</Interval>
</Period>
</MolTimeSeries>
<MolTimeSeries>
<ContractIdentification v="NG_20100331_1500_6"/>
<ResourceProvider codingScheme="A01" v="10X1001A1001A515"/>
<AcquiringArea codingScheme="A01" v="17Y100Z100Z00013"/>
<ConnectingArea codingScheme="A01" v="10YGB----------A"/>
<AuctionIdentification v="AUCTION_20100331_1500_1600"/>
<BusinessType v="A10"/>
<BidTimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<MeasureUnitQuantity v="MAW"/>
<Currency v="EUR"/>
<MeasureUnitPrice v="MWH"/>
<Direction v="A01"/>
<MinimumActivationQuantity v="50"/>
<Status v="A06"/>
<Period>
<TimeInterval v="2010-03-31T15:00Z/2010-03-31T16:00Z"/>
<Resolution v="PT60M"/>
<Interval>
<Pos v="1"/>
<Qty v="50"/>
<EnergyPrice v="17.0"/>
</Interval>
</Period>
</MolTimeSeries>
</MolDocument>Hi,
The result I got was:
16RTE_20100331_1500_20NG_20100331_1500_6In the query you tried, you access a single record so you can't expect to get three rows "magically". The EXTRACT function just works as expected, it extracts the requested nodes, but the result is still an XML fragment (a scalar value).
In order to achieve your goal, you have to break the MolTimeSeries sequence into relational rows.
Two similar solutions are possible, XMLTable (10gR2 and up) or Table/XMLSequence.
In your other post you mentioned db version 10.1, so I guess we'll go with XMLSequence :
SELECT 'RTE'
,to_date(substr(extractvalue(x.xml_data,'/MolDocument/ValidTimeInterval/@v'),1,16),'yyyy-mm-dd"T"hh24:mi')
,decode(extractvalue(x2.column_value,'/MolTimeSeries/Direction/@v'),'A01','Up','Down')
,to_number(regexp_substr(extractvalue(x2.column_value,'/MolTimeSeries/ContractIdentification/@v'),'\d+$'))
,to_number(extractvalue(x2.column_value,'/MolTimeSeries/Period/Interval/EnergyPrice/@v'))
,sysdate
,null
,null
,extractvalue(x2.column_value,'/MolTimeSeries/ContractIdentification/@v')
,'SUBMITTED'
,'A96'
,null
,sysdate
FROM xml_demo x,
table(
xmlsequence(
extract(x.xml_data, '/MolDocument/MolTimeSeries')
) x2
WHERE existsnode(x.xml_data,'/MolDocument/DocumentIdentification[@v="MOL_20100331_1500_1600"]') = 1;Please also note the use of REGEXP_SUBSTR instead of the regular SUBSTR because it didn't work for "NG_20100331_1500_6".
Hope that helps.
Edited by: odie_63 on 24 juin 2010 21:18 - added regexp comment -
How to achieve parent - child record insert in forms
Guys,
I am new to forms. I do have a requirement where I need to create one tabular block for 10 rows (parent record) and then I need to create three tabular tabs of 5 rows for detailed records (child). That means each tab can have 5 records for 1 parent row.. Thats how this parent-child structure has ONE to MANY relationships
To achieve this requirement I created one parent block of table type (using table XX_Parent) and then I created three detailed block for each tab (Tab_A,Tab_B,Tab_C) using child table (XX_Child). For each tab while inserting the data I took one context_value column in child table. i.e. when I insert the data using Tab_A , context_value column will be A. In the same way B and C for Tab_B for Tab_C respectively. And I wrote this logic at PRE-INSERT trigger for each tab. But when I insert the data for all the tabs, it allows me to enter successfully for Tab_A only, the moment I navigate from Tab_A to enter the data intoTab_B, it throws me error like "You are passing NULL value to set context_value". I hope I make the requirement clear to you.
I am not sure if I am following the right approach to achieve my requirement. if its not right, please suggest me right one.. and if its right please guide me resolve the error..
Looking forward to your reply.
Thanks
SunilAndreas,
I had already created relations between Matster Block -Tab_A block, Master Block -Tab_B block and Master Block - Tab_C block...
The point is all the three tabs are created using one table XX_Child only.. I used context_value A,B and C respectively so that once I query the data for XX_Child from backend, I should be in a position to figure out what data is inserted using Tab A, B and C. why I need so .. because If take my entire form in query mode and search for a master record.. then Tab_A, tab_B and Tab_C display their respective data. I hope, I make you understand.. Can you please guide me.
Thanks
Sunil -
Default filters which the users can delete (in parent/child setup)?
Is it possible in Latitude 2.2.2 to have filters (range filters, refinement filters etc.) applied by default (meaning users see these filters when they log-in), but they can also remove them (using Breadcrumbs portlet) if they wanted to? We tried using the data source (JSON) filters (using "baseFunctions" setting) where we have a parent/child setup, but it seems those filters cannot be removed once applied. Note that the filters can be removed if we do not have a parent/child relationship amongst the data sources, but as soon as we introduce a parent/child relationship amongst the data sources (which we need to have), the filters get sticky and cannot be deleted. Any reason why parent/child relationship causes the filters to become sticky? Any (alternate) means to achieve what we want?
Thanks Dave - that issue is the issue we are facing, and it does have a hotfix - I will contact support and get it for our client. Thanks for your help.
Mahim. -
Deleting rows with child records
Hi,
I want to delete some records from master table based on where condition. But I want all the corresponding child record should also delete from the respective child tables..
Can anyone tell me how to go about it with example( eg emp & dept table of scotts)
RegardsI have been to slow for posting...
Please note that I hate doing this
SCOTT@LSC01> select count(*) from emp;
COUNT(*)
14
SCOTT@LSC01> delete dept where deptno=10;
<font color=red>1 row deleted.</font>
SCOTT@LSC01> select count(*) from emp;
COUNT(*)
11the risk is that someone is not aware of deleting rows, and instead of getting
SCOTT@LSC01> delete dept where deptno=10;
delete dept where deptno=10
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_DEPTNO) violated - child record foundhe is deleting rows in other tables and will never be aware of that deletion ... -
Union on tables with parent-child records and Sorting
Hi,
I have an application that has an existing query which returns org units (parent and child) from organization table with a sort on createddate + org_id combination
WITH Org_TREE AS (
SELECT *, null as 'IS_DELETED', convert (varchar(4000), convert(varchar(30),CREATED_DT,126) + Org_Id) theorderby
FROM Organization WHERE PARENT_Org_ID IS NULL and case_ID='43333'
UNION ALL
SELECT a1.*, null as 'IS_DELETED', convert (varchar(4000), a2.theorderby + convert(varchar(30),a1.CREATED_DT,126) + a1.Org_Id)
FROM Organization a1 INNER JOIN Org_TREE a2 ON a1.PARENT_Org_ID = a2.Org_Id and case_ID='43333'
SELECT * FROM Org_TREE order by theorderby
I have created a new log table for organization 'Organization_Log' with exact columns as Organization table with an additional 'IS_DELETED' bool column.
Questions:
I need to modiy the query,
1. To display the parent and child records both from the organization table and organization_log table.
2. the sort on the result should be based on 'Organization Name' column asc. First with parent org and the child org underneath it. For eg.
aaa
==>fff
==>ggg
bbb
==> aaa
==> hhh
Any help on how the query should be constructed?
Thanks
gkol@Visakh16,
I am getting...
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
The problem is that you will have different number of columns in both log and Organization and Organizationlog tables. UNION/UNION ALL expect the same number of columns.
Try the below:
WITH Org_Log_TREE AS (
SELECT Organization_name,Org_id,Parent_Org_id, IS_DELETED, CAST(Organization_Name AS varchar(max)) AS theorderby,1 AS level
FROM Organization_Log WHERE PARENT_Org_ID IS NULL and case_ID='43333'
UNION ALL
SELECT a1.Organization_name,a1.Org_id,a1.Parent_Org_id, a1.IS_DELETED, CAST(a2.theorderby +'/' + CAST(a1.Organization_Name AS varchar(1000)) AS varchar(max)),a2.Level + 1
FROM Organization_Log a1 INNER JOIN Org_Log_TREE a2 ON a1.PARENT_Org_ID = a2.Org_Id and case_ID='43333'
) ,Org_TREE AS (
SELECT Organization_name,Org_id,Parent_Org_id, NULL AS IS_DELETED, CAST(Organization_Name AS varchar(max)) AS theorderby,1 AS level
FROM Organization WHERE PARENT_Org_ID IS NULL and case_ID='43333'
UNION ALL
SELECT a1.Organization_name,a1.Org_id,a1.Parent_Org_id,NULL AS IS_DELETED, CAST(a2.theorderby +'/' + CAST(a1.Organization_Name AS varchar(1000)) AS varchar(max)),a2.Level + 1
FROM Organization a1 INNER JOIN Org_TREE a2 ON a1.PARENT_Org_ID = a2.Org_Id and case_ID='43333'
SELECT * FROM Org_Log_TREE
UNION ALL
SELECT * FROM Org_TREE
ORDER BY LEFT(theorderby,CHARINDEX('/',theorderby + '/')-1),Level -
How to build what a parent child record looked like from audit history
I've got a simple parent child relationship (eg DEPT/EMP) and I have audit triggers on the 2 tables that log any changes. The 2 tables are seen by the User as 1 entity, so if an EMP record changes, that is essentially a DEPT change. I want to show a record where the info shown is correct at that particular point in time.
Now for a very crude example to illustrate...
So, says it's 9:00 and we have:
Dept 1=Sales
Emp 1=Clark
Emp 2=Smith
Now we change Emp 1 at 9:01 to Smythe
Next we change Dept 2 at 9:02 to Sales UK
Next we add Emp 3=Jones at 9:04
Next we change Emp1 at 9:05 to Clarke
So now if the User looks at the history of Dept 1 they will see it has changed at the following times:
9:01 (emp change)
9:02 (dept change)
9:04 (emp change)
9:05 (emp change)
even though the actual Dept table was only changed once.
This part is easy enough to extract but the next part I'm struggling to get my head around (must be Friday afternoon!).
The User wants to be able to view what the "Dept" looked like at the time of the change. So we would get the following results:
9:00 Dept 1=Sales, Emp 1=Clark, Emp 2=Smith (as per original data)
9:01 Dept 1=Sales, Emp 1=Clark, Emp 2=Smythe
9:02 Dept 1=Sales UK, Emp 1=Clark, Emp 2=Smythe
9:04 Dept 1=Sales UK, Emp 1=Clark, Emp 2=Smythe, Emp 3=Jones
9:05 Dept 1=Sales UK, Emp 1=Clarke, Emp 2=Smythe, Emp 3=Jones
I'm trying to write a bit of SQL to do this but the tricky bit comes in due to having 2 different tables that have triggered the change to a "DEPT". I see the output as being as many rows as there are children, so the raw output for the above summary would be along the lines of:
9:00, Dept 1=Sales, Emp 1=Clark
9:00, Dept 1=Sales, Emp 2=Smith
9:01, Dept 1=Sales, Emp 1=Clark
9:01, Dept 1=Sales, Emp 2=Smythe
9:02, Dept 1=Sales UK, Emp 1=Clark
9:02, Dept 1=Sales UK, Emp 2=Smythe
9:04, Dept 1=Sales UK, Emp 1=Clark
9:04, Dept 1=Sales UK, Emp 2=Smythe
9:04, Dept 1=Sales UK, Emp 3=Jones
9:05, Dept 1=Sales UK, Emp 1=Clarke
9:05, Dept 1=Sales UK, Emp 2=Smythe
9:05, Dept 1=Sales UK, Emp 3=Jones
Any help appreciated!!
An alternative to all this is to make my trigger on each table populate this info (ie write whatever is currently in place) into a table structured as I have mentioned above (so Dept i denormalised) but that looks to be a bit messy.Two tables, Dept and Emp. Both have audit triggers inserting into it's own audit table.
create or replace table DEPT(
dept_no number,
dept_name varchar2(50),
dept_city varchar2(50));
create or replace table EMP(
emp_no number,
emp_surname varchar2(100),
emp_firstname varchar2(50),
emp_dept_no number);dept_no pk of DEPT
emp_no pk of EMP
emp_dept_no FK from EMP to DEPT.dept_no
create or replace table DEPT_AUDIT(
dept_no number,
dept_name varchar2(50),
dept_city varchar2(50),
audit_date_time date);
create or replace table EMP_AUDIT(
emp_no number,
emp_surname varchar2(100),
emp_firstname varchar2(50),
emp_dept_no number,
audit_date_time date)
create or replace trigger dept_audit
after insert or update
on dept for each row
begin
insert into dept_audit(dept_no, dept_name, dept_city, audit_date_time)
values(:NEW.dept_no, :NEW.dept_name, :NEW.dept_city, sysdate);
end;
create or replace trigger emp_audit
after insert or update
on emp for each row
begin
insert into emp_audit(emp_no, emp_surname, emp_firstname, emp_dept_no, audit_date_time)
values(:NEW.emp_no, :NEW.emp_surname, :NEW.emp_firstname, :NEW.emp_dept_no, sysdate);
end;My above example (ignoring that the columns don't match up but hopefully you get the drift) would end up with the following results in the 2 audit tables:
DEPT_AUDIT
9:00 Dept 1=Sales (insert)
9:02 Dept 1=Sales UK (update)
EMP_AUDIT
9:00 Emp 1=Clark (insert)
9:00 Emp 2=Smith (insert)
9:01 Emp 2=Smythe (update)
9:04 Emp 3=Jones (insert)
9:05 Emp 1=Clarke (update)
As I said originally, I want to get a view of what the "DEPT" looked like at a particular time and to do this I need to take into account the EMP changes for the DEPT which is why my results would be as follows:
9:00 Dept 1=Sales, Emp 1=Clark, Emp 2=Smith
9:01 Dept 1=Sales, Emp 1=Clark, Emp 2=Smythe
9:02 Dept 1=Sales UK, Emp 1=Clark, Emp 2=Smythe
9:04 Dept 1=Sales UK, Emp 1=Clark, Emp 2=Smythe, Emp 3=Jones
9:05 Dept 1=Sales UK, Emp 1=Clarke, Emp 2=Smythe, Emp 3=Jones
Though what I really want is the rows that make it up like:
9:00, Dept 1=Sales, Emp 1=Clark
9:00, Dept 1=Sales, Emp 2=Smith
9:01, Dept 1=Sales, Emp 1=Clark
9:01, Dept 1=Sales, Emp 2=Smythe
9:02, Dept 1=Sales UK, Emp 1=Clark
9:02, Dept 1=Sales UK, Emp 2=Smythe
9:04, Dept 1=Sales UK, Emp 1=Clark
9:04, Dept 1=Sales UK, Emp 2=Smythe
9:04, Dept 1=Sales UK, Emp 3=Jones
9:05, Dept 1=Sales UK, Emp 1=Clarke
9:05, Dept 1=Sales UK, Emp 2=Smythe
9:05, Dept 1=Sales UK, Emp 3=Jones
Hope that is a bit clearer.
thanks for taking time to look. -
Hello
I am trying to mimic the FOR XML EXPLICIT behavior of SQL Server code in Oracle 11g.
The XML EXPILICT mode transforms the rowset that results from the query execution into an XML document and it preserves the parent child relationship in the XML output. For example
SELECT customer.id,customer.name,order.id,order.date,orderdetail.id,orderdetail.pid
FROM CUSTOMER,ORDER,ORDERDETAIL
WHERE CUSTOMER.ORDERID=ORDER.ORDERID
AND
ORDER.ORDERID=ORDERDETAIL.ORDERID
<Customer ID="C1" name="Ann">
<Order id="O1" date="1/20/2008">
<OrderDetail id="OD1" pid="P1"/>
<OrderDetail id="OD2" pid="P2"/>
</Order>
<Order id="O2" date="3/29/1997">
</Customer>
<Customer ID="C2" name="Jack">
<Order id="O1" date="1/20/2009">
<OrderDetail id="OF1" pid="P1"/>
<OrderDetail id="OF2" pid="P2"/>
</Order>
<Order id="O2" date="3/29/1997">
<OrderDetail id="OX1" pid="D1"/>
<OrderDetail id="OX2" pid="D2"/>
</Order>
</Customer>
Appreciate if you can help me to write an Oracle equivalent of this code.
Thanks & RegardsYou can use xmlelement and xmlagg functions this way:
SQL> with customer as (
2 select 'C1' id, 'Ann' name from dual union
3 select 'C2' id, 'Jack' name from dual),
4 Orders as (
5 Select 'O1' id, '1/20/2008' odate, 'C1' custid from dual union
6 Select 'O2' id, '3/29/1997' odate, 'C1' custid from dual union
7 Select 'O3' id, '1/20/2008' odate, 'C2' custid from dual union
8 Select 'O4' id, '3/29/1997' odate, 'C2' custid from dual),
9 orderdetail as (
10 select 'OD1' id, 'P1' pid, 'O1' orderid from dual union
11 select 'OD2' id, 'P2' pid, 'O1' orderid from dual union
12 select 'OF1' id, 'P1' pid, 'O3' orderid from dual union
13 select 'OF2' id, 'P2' pid, 'O3' orderid from dual union
14 select 'OX1' id, 'D1' pid, 'O4' orderid from dual union
15 select 'OX2' id, 'D2' pid, 'O4' orderid from dual
16 )
17 -- End of test data, actual query follows
18 SELECT xmlagg(
19 xmlelement("Customer",
20 xmlattributes(id, name),
21 (select xmlagg(
22 xmlelement("Order",
23 xmlattributes(o.id, o.odate as "date"),
24 (select xmlagg(
25 xmlelement("OrderDetail",
26 xmlattributes(id,pid),
27 null
28 )
29 )
30 from orderdetail d
31 where d.orderid = o.id
32 )
33 )
34 )
35 from orders o
36 where CUSTOMER.ID=O.CUSTID
37 )
38 )
39 ).extract('/*') xml
40 from customer;
XML
<Customer ID="C1" NAME="Ann">
<Order ID="O1" date="1/20/2008">
<OrderDetail ID="OD1" PID="P1"/>
<OrderDetail ID="OD2" PID="P2"/>
</Order>
<Order ID="O2" date="3/29/1997"/>
</Customer>
<Customer ID="C2" NAME="Jack">
<Order ID="O3" date="1/20/2008">
<OrderDetail ID="OF1" PID="P1"/>
<OrderDetail ID="OF2" PID="P2"/>
</Order>
<Order ID="O4" date="3/29/1997">
<OrderDetail ID="OX1" PID="D1"/>
<OrderDetail ID="OX2" PID="D2"/>
</Order>
</Customer>Max
[My Italian Oracle blog|http://oracleitalia.wordpress.com/2010/02/07/aggiornare-una-tabella-con-listruzione-merge/] -
QA_RESULTS_INTERFACE, entring parent-child records.
I am unable to create parent - child relationships while using QA_RESULTS_INTERFACE and import program.
I am unable to create parent - child relationships while using QA_RESULTS_INTERFACE and import program.
-
Populate Parent/Child records with "Family" value
Hi,
I typically do the task I'm asking assistance with in Excel and it works great... the only problem is that it's VERY slow and takes a lot of work when over 1 million rows as you must split it up and yeah just painful! But what I'm trying to accomplish is
pretty straight forward for Excel, however escapes me in T-SQL! I have an ordered number that is sorted asc. I have a flag that indicates a record is the "Parent". I want to update the family value for the "Parent" and all sequential records
until the next "Parent" records is reached. So here is an example in Excel.
Using the following formula in cell C2 and pasting all the way to the last record, I can easily(for smaller sets anyway) create my desired results.
=IF(B2="Y",A2,C1)
Number Flag Family
1 Y 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 Y 9
10 9
11 Y 11
12 11
13 11
14 Y 14
15 14
16 14
17 14
18 14
19 14I have an article on this exact topic
Fixing
Missing Data Based on Prior Row Information
It shows the concept of using OUTER APPLY to achieve desired functionality.
For every expert, there is an equal and opposite expert. - Becker's Law
My blog
My TechNet articles
I wish I knew how to apply this OUTER APPLY solution to an update statement so I could use. Would this be more efficient and faster than the solution provided by RyanAB? I have millions of records and NOT enough time... the fastest solution is definitely desired!!!
I ended up using this as a solution as it was the fastest. I first did:
SELECT a.Number, M.Number 'Family' into FamilyTable FROM Table a
OUTER APPLY (
SELECT TOP (1) *
FROM Table b
WHERE a.Number >= b.Number and b.[Flag] = 'Y'
ORDER BY b.[Number] DESC) M
ORDER BY 1, 2
Then updated the original like so:
update a set a.Family = b.Family
FROM Table a inner join FamilyTable b
on a.Number = b.Number
Thanks to all!!! -
Merging of Parent-Child record
Hi SDNers,
I have a query about mearging record in Import Manager.
I need your advice in Mearging a record which is not at leaf level but at Node level.
To make it clear:
For Ex:
Country
> State
>> City 1
>>> Region
>>>> District
>> City 2
>>> Region
>>>> District
I need to merge City 1 and City 2 (tht's at Node level)
PS: As for thins example I am able to merge @ District level what i need is mearging at City level
Regards,
KrutarthHi Maheshwari,
Thnx for prompt responce.
Could you extend the methodology with some details.
Regards,
Krutarth -
Create foreign keys to delete child records
I am unfamiliar with foreign keys, I have 3 tables one is the parent table if a record is deleted in the parent table I would like the record to be deleted from the child record but I think that I am also confused about which should be the parent table
(purpose is to use in a form)
parent table (i think)
AdminEntry table
entryid ,
date1,
date1desc,
date2,
date2desc,
date3,
date3desc
In a form each date and its description is placed in the following table
CalendarEntry table
calendarid,
date,
datedesc
entryid (fk)?
so CalendarEntry will have many entries at least 3 from one entryId, this I get but what if I want to delete lets say date2 and date2desc record. If I delete it from AdminEntry table how will calendarEntry table know which one to delete?
Please help very confused.
(the other table also inserts to the CalendarEntry table)There is a demo of this functionality in Morgan's Library at www.psoug.org under Foreign Keys.
Look for ON DELETE CASCADE. -
Problem in deleting child record
Hi,
I have a requirement to remove the child records.
I have two database tables (without any foreign key or database constraints). I have created EOs (ParentEO and ChildEO) and Association. I have created view objects (ParentVO with a transient attribute called "SelectFlag" and ChildVO) based on EOs.
I have created a MollyViewLink and created Application module (MollyAM) .VOs are associated with AM.
For detail records, I have created delete icon and I have written below code to handle the deleteChild event in detail region's controller:
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
super.processFormRequest(pageContext, webBean);
if ("deleteChild".equals(pageContext.getParameter(EVENT_PARAM)))
MollyAMImpl am = (MollyAMImpl)pageContext.getApplicationModule(webBean);
String rowReference = pageContext.getParameter(OAWebBeanConstants.EVENT_SOURCE_ROW_REFERENCE);
System.out.println("Child ROW Reference =="+rowReference);
MollyUserDetailsVORowImpl voRow = (MollyUserDetailsVORowImpl)am.findRowByRef(rowReference);
String parentID = voRow.getId().toString();
System.out.println("ID is : "+ parentID);
voRow.remove();
System.out.println("Child row deleted successfully...");
am.getTransaction().commit();
When I click on delete icon at child record, I get below SOP messages:
Child ROW Reference ==MollyAM.MollyUserDetailsVO_MollyViewLink_MollyUserDetailsVO:MollyUserDetailsVO_MollyViewLink_MollyUserDetailsVO_0{null}
ID is : 52
Child row deleted successfully...
Child record is also being removed from UI. But when I query the database, I can still see the records there. For me, it seems like commit is not affecting the child table.
Similar code to delete the parent record is working fine.
Thanks!!!Hi Vinod ,
I am deleting condition record number if know any function module please let me know
problem happing in PRD for particular condition numer it showing INTERNAL ERROR (This is the condition table A923)
that condition number is their in KONH but not their in KONP because of that INTERNAL ERROR occuring
for that i have writen code for that deleting the condition number ....
if know any thing please let me know -
Delete the parent records and child table records at a time
hi all;
I am facing the pbm like to delete the all records in child table and corresponding records in parent table at a time. so I want to delete the all the records in child table and corresponding parent records in parent table by using single SQL query. plz help me
Thanks in advanceYou want to use one single SQL statement to delete the child records in a table and the corresponding master records in the master table??
That's not quite possible with a single SQL, of course unless you are talking about Oracle Forms, where you have a relation and set the delete behavior to Cascading, like said in the above posts.
Tony
Maybe you are looking for
-
Planning file entry for MRP Area
Hi, To create planning file entry in the background at plant level we use Transaction MDAB. I would like to know that if MRP area is active than whats the T-code for planning file entry in the background at mrp area level?? To create manualy in the T
-
I need help with an app game purchase
I recently added 20$ to my account with 2 10$ Itunes cards. I play the app called clash of clans, in the game you can buy things with itunes, I tried to make a purchase for 19.99 when there is just about 21 $ in my itunes and it's telling me I have i
-
i just got this phone and im so lost im having problems puttig my pics and music on the phone from my memory card from my previous phone
-
Desktop link keeps disappearing from Favorites pane
On my 10.9.4 MacBook Air, all of a sudden I have the following weird problem. The "Desktop" link is missing from the left panel of Favorites on any Finder window. I drag it there, and next window I open - it's gone again! What is going on?!?
-
Problem dragging contacts into numbers
Hello all, and I hope you can help. I'm a relative newbie to the forums (other than lurking occasionally), but quite an experienced Mac user. I am trying to get contacts into a spreadsheet. I have tried the two methods of (1) dragging individual cont