Help in nega max+alpha beta pruning
well I have programmed a connect four which implemented minimax algorithm,but then it took 10 secs(minimum) to reply for maxdepth of 8. More over it still lost few games to online ai's which to my surprise played faster and more accurate than my program.Then by searching in books and internet I came across search funtion called as megamax with alpha-beta pruning.I replaced my minimax with this method but then it plays very bad(doesn't even see the connect 4 even if there are 3 in a row).I am willing to put my source code, pls point out my mistakes and rectify (with explanations if possible). Thank you, and also forgive me for grammatical mistakes(if any) as english is my second language.
I know alpha beta is a bit tedious thing to do(at least for me as I am doing it for the very first time).
So I request you all to please help
Here is the source code
package connect4;
import java.io.*;
import java.util.*;
public class Connect4 {
private static final int WIDTH=7, HEIGHT=6;
private static int MAX_RECURDEPTH=8;
private static BufferedReader in;
private int[][] grid=new int[WIDTH][HEIGHT];
private int[] columnHeight=new int[WIDTH];
private static int recurDepth=0;
public static void main(String[] args) {
in=new BufferedReader(new InputStreamReader(System.in));
new Connect4();
public Connect4() {
Scanner read=new Scanner(System.in);
int column,p;
int player=1;
System.out.println("Who play first?");
System.out.println("1.Player");
System.out.println("2.Computer");
p=read.nextInt();
player=p;
double a=-MAX_RECURDEPTH;
double b=MAX_RECURDEPTH;
int move=0;
double value=0;
Vector moves=new Vector();
while(true) {
if(player==1) {
printGrid();
do {
System.out.println("Make your move (1-7): ");
column=readInt()-1;
} while(column<0 || column >=WIDTH || columnHeight[column]>=HEIGHT);
} else {
moves.removeAllElements();
column=0;
value=0;
double prevValue=-MAX_RECURDEPTH-1;
for(int x=0; x<WIDTH; x++)
if(columnHeight[x]>=HEIGHT)
continue;
if (move==0)
moves.add(new Integer(3));
break;
if(p==2 && move==1)
moves.add(new Integer(3));
break;
value=minmax_ab(2,x,a,b);
if(value>prevValue) {
moves.removeAllElements();
prevValue=value;
if(value==prevValue)
moves.add(new Integer(x));
move++;
System.out.println("VAlue="+prevValue);
if(moves.size()>0) {
Collections.shuffle(moves);
column=((Integer)moves.get(0)).intValue();
if(moves.size()==0) {
System.out.println("Its a draw.");
break;
grid[column][columnHeight[column]]=player;
if(player==2)
System.out.println("I PUT MY CHECKER IN "+(column+1));
columnHeight[column]++;
int haswon=0;
haswon=fourInARow();
if(haswon>0) {
printGrid();
if(player==2)
System.out.println("I WON");
else
System.out.println("YOU WON");
break;
player=3-player;
double minmax_ab(int player, int column,double a,double b) {
double value=0;
if(columnHeight[column]>=HEIGHT)
return 0;
grid[column][columnHeight[column]]=player;
columnHeight[column]++;
if(columnHeight[column]>=HEIGHT)
return 0;
recurDepth++;
if(fourInARow()>0) {
if(player==2)
value=(MAX_RECURDEPTH+1)-recurDepth;
else value=-MAX_RECURDEPTH-1+recurDepth;
if(recurDepth<MAX_RECURDEPTH&&value==0)
value=MAX_RECURDEPTH+1;
for(int x=0; x<WIDTH; x++)
if(columnHeight[x]>=HEIGHT)
continue;
double v=-minmax_ab(3-player,column,-b,-a);
if(value==(MAX_RECURDEPTH+1))
value=v;
else if(player==2)
if(v>value)
value=v;
else if(v>value)
value=v;
else if(v>a)
a=v;
else if(a>=b)
return value;
recurDepth--;
columnHeight[column]--;
grid[column][columnHeight[column]]=0;
return a;
int fourInARow() {
int num, player;
for(int y=0; y<HEIGHT; y++) {
num=0; player=0;
for(int x=0; x<WIDTH; x++) {
if(grid[x][y]==player) num++;
else { num=1; player=grid[x][y]; }
if(num==4 && player>0)
return player;
for(int x=0; x<WIDTH; x++) {
num=0; player=0;
for(int y=0; y<HEIGHT; y++) {
if(grid[x][y]==player) num++;
else { num=1; player=grid[x][y]; }
if(num==4 && player>0) return player;
for(int xStart=0, yStart=2; xStart<4; ) {
num=0; player=0;
for(int x=xStart, y=yStart; x<WIDTH && y<HEIGHT; x++, y++) {
if(grid[x][y]==player) num++;
else { num=1; player=grid[x][y]; }
if(num==4 && player>0) return player;
if(yStart==0) xStart++;
else yStart--;
for(int xStart=0, yStart=3; xStart<4; ) {
num=0; player=0;
for(int x=xStart, y=yStart; x<WIDTH && y>=0; x++, y--) {
if(grid[x][y]==player) num++;
else { num=1; player=grid[x][y]; }
if(num==4 && player>0) return player;
if(yStart==HEIGHT-1) xStart++;
else yStart++;
return 0;
void printGrid() {
int x=0;
int y=0;
for(y=HEIGHT-1; y>=0; y--)
for(x=0; x<WIDTH; x++)
if(grid[x][y]==0)
System.out.print(" * ");
else if(grid[x][y]==1)
System.out.print(" A ");
else if(grid[x][y]==2)
System.out.print(" B ");
System.out.println();
System.out.println();
System.out.println(" 1 2 3 4 5 6 7 ");
int readInt() {
try {
String input=in.readLine();
int number=Integer.parseInt(input);
return number;
} catch(NumberFormatException e) {
return -1;
} catch(IOException e) {
return -1;
Similar Messages
-
Min max with Alpha Beta pruning
Hey I would like to add Min max with Alpha - Beta pruning for my tic tac toe game. If you know some sort of tutorial or anything please let me know. After I complete I'm going to make a complete guide to make a Tic Tac Toe game with a really nice GUI, Music, AI, and Network capabilities. I have the game made so far. I'm going to rewrite it with interfaces and clean up the code a lot then create the guide, but before I do all this I want to create and AI for it.
I suppose that since, other than reading a summary on Wikipedia, I
don't know what a 'minimax algorithm' is and have never tried to
implement one I should not make fun.The idea is quite simple: your best move e.g. in a board game is my worst
result and vice versa. If I can minimize your best move I have maximized
my best move (and that's the move I'll play).
Now suppose my best move somewhere in that game tree turns out
to be worse than another best move of mine somewhere else in that
same tree, there is no need anymore for me to explore the rest of that
subtree. That's the alpha pruning part. The same counts for you and
that's the beta pruning part.
alpha-beta pruning reduces the number of nodes to be examined to
O(sqrt(n)) where n are all the nodes in the fully examined tree. It is
quite a nice algorithm although quite tricky too when you have to build it.
The best reference I can think of now is the old book "Data Structures"
by Horrowitz and Sahni.
kind regards,
Jos -
Hii i m frm BGD. I m using iphone 5. My carrier BGD ROBI AXIATA. When it was ios 6 it works better . But i recently upgrade to ios 7 and i facing the little problem. One of the ussd call. Plz help or suggest ir doing better about itz as soon as possible.
I'm not trying to minimize your issues, but I have an iPhone 5S and find that I have not had these types of problems on AT&T. I'm wonding if something has gotten stuck in a loop that is continually trying to use data. If you make a good backup of your phone, try restoring it as new, and do not add anything to the phone right away. Let the device run like this for a little while and see what kind of usage you have. You report you phone is showing usage of 21GB. Did you rese this setting on the phone to begin at your billing period? The reason I ask this is some people believe this setting resets on its own with your billing period, it does not. This has to be manually reset by the user, so it might not be that accurate depending on the last time that you reset it.
If the phone seems to not use so much extra data during the period the device does not have extra apps on it, then try restoring from your backup and see what happens. If this increases your data usage quite fast again, then there is probably something corrupt in the backup that is causing this issue. -
S&OP factor calculation (alpha, beta, gamma)
Hi gurus,
I´m trying to adap the automatic forecast selection in MC88 transaction to a graphic company scenario. They have several clients where they planned all the forecast for them, based on increase/decrease sales of each client. Today they are using the alpha, beta, gama factors but they still need to calculate the demand in a Excel spreadsheet and adjust the result in SAP.
My questions are:
- There´s any way to change the factors criteria? For example, if I want to increase the forecast for 2012 in 10% over 2011. If not, anyone knows a way to input this growing factor into the automatic forecast?
- I already found the formulas for the alpha, beta, gamma, but it´s not didactic to explain to some users. Anyone knows where I can find a simple and objective explanation for this factors?
Thanks in advance.
Best Regards,
Felipe TavaresHi,
It's your wrong assumption that clients are not using Forecast. Most of the Retails clients are effectively using forecast.
Without forecasting, Retail operation will not work at all.
A demand forecast is a prediction of the amount of each article / product that will be sold in the future. It's easy to see that inaccurate forecasts can cause major problems for your company. When forecasted demand is far below actual demand for a product, you risk running out of products and disappointing your customers. If forecasted demand exceeds actual usage, you'll probably be faced with large quantities of dead stock and slow-moving inventory.
For your company to be successful, your demand forecasts for products must be as accurate as possible.
(a) Alpha is used in the basic value calculation
(b) Beta is used in trend value calculation
(c) Gamma is used in the Seasonal index calculation
The value for the parameters range from 0 to 1. A higher value will place more emphasis on recent history. The parameters also control how reactive the forecast is to changes in historical patterns.
This is FYI.
Bye,
Muralidhara -
Special character alpha, beta, sigma insert in Form 5
Hi everyone,
I have a problem to insert special character alpha, beta, sigma
in form 5. when I insert these characters is display it code
not display it actual symbol.
How I could solve this problem.
with advance thanks
MateenHi everyone,
I have a problem to insert special character alpha, beta, sigma
in form 5. when I insert these characters is display it code
not display it actual symbol.
How I could solve this problem.
with advance thanks
Mateen -
Everything from repositories to the FTP server is deleted. It's like Maemo is completely forgotten. Ovi Store hasnt been updated since Fennec 6. On the FTP servers there where v13,14 but now Maemo folders are deleted. Where I can obtain the latest alpha, beta & stable versions?
There is a fellow by the name of Romaxa who has been supplying the recent Firefox builds for the OVI store.
* http://store.ovi.com/content/257468
* http://romaxa.bolshe.net/fennec/ -
Why does iMessages does not work properly ? Please help me ! Its works better with the previous version if compared with the latest iOS
Many, many thanks for both of you Todd and Rick.
to Rick:
I suppose you mean the Color Settings in Project Settings as follows:
- Working Space: None
- Match Legacy ... Gamma Adjustments checked ON
But it does not correct the colors in effects. And checking or unchecking Make Movie/Output Module Settings/Color Management/Profile/Preserve RGB does not make any difference.
to both of you:
Those parts of the video image that does not have color effects are just fine. In these parts the color is preserved when reimporting to FCP. However, those parts having color effects (except Levels, as decribed earlier) have altered color results. So, only the parts having effects affecting color are misinterpreted in the image area. The mismatch is of course seen in AE, before making the movie.
What I ment with "Color Management not working properly" is that (instead of "disabling" it) Color Management does not seem to be able to correct this "misinterpretation" or difference in effect handling between AE 6 and 10.
So, would you have any solution for this problem?
Again, many thanks for your fast replies! -
Alpha, beta, gamma, delta waves in Logic Pro 9
Can anyone tell me if there is an easy way to create alpha, beta, gamma, delta waves?
ThanksIn response to...
"You're kidding, right? Those are words used to describe electrical fluctuations that result from brain activity. A computer is not a brain and so even if you use it to generate wave forms that match those of a brain in action, it is not by definition an "alpha, beta, gamma, or delta wave."
Let me just say this:
http://www.gobrainev.com/?gclid=CIbpzfzHrp8CFRlZbQodv3pO2A -
Help! sis648 max-L+DDR 400 =Problems???
Hi there,
have recently bought sis648 max-L and still hope I will bring this mobo to work!!!
I mainly use my computer for games. But had always freezing problems during games. It was either quiting the game abruptly to fall back to the desktop or simply ffreezing the screen and then I had to reboot.
I tried all I know to stabilize my system in changing bios settings, tried out directx 8.1 and 9.0, checked the ram, flashed the bios from version 1.2 to 1.3, tried to play with minimal video settings in each tested game (morrowind, hitman2) and installed all latest drivers I could find.
The only thing that improved the stability was to diseable the "spread spectrum" setting in bios.
Has someone an good advice what next I could try? ?(
Could it be the ram or the video card?
I would like to avoid buying new DDR or a new mobo... :]
ThanksHi everybody,
thanks for helping me.
I changed the voltage of my ram from 2.6 to 2.5v and that improved the stability a lot. :D
But I still got some freezings during games (but less often) and I had to run under "safe" DRAM timing settings... :(
To get a perfectly stable system, I had to "underclock" my DDR400 to DDR333. ;(
At least, I was able then to run my system under "ultra" DRAM timing settings.
What do you think, would I get better results with safe settings+DDR400 or ultra settings+DDR333 in games ?(
By! 8) -
Help: importing PNG's Alphas to make a sprite sheet
Hi All,
I need some help with making PNG sprite sheets with Photoshop CS4 Extended.
The issue is with Photoshop. When I bring in the PNG animation sequence image 1 then 2 I lose the alpha after that.
What is the best way to bring in multpel alphas to make a sprite-sheet? The trick I have used so far has given me
bad results.
* Note: I have rendered out 35 frames of an animation sequence from 3Ds Max 9 as .PNGs & .TGAs with alphas.
Thanks in advance :-)
My curent way of doing this is:
Steps:
1. Launch Photoshop CS4 Extended
2. Set document size to 256X512
3. Set up a grid 32X32 pixles
4. Open Frames 1 to 35 of animation
5. place frames in order on sprite sheets
Note: open "Channels Panel" observe only the 1st frame has an alpha
And my work-around is to do the same steps for the alpha by opening each frame in Photoshop and going in the Channels tab and selecting just the alpha layer. Then copy and pasting it into new photoshop document to make the sprite sheet's alpha. Once
the alpha sprite sheet is done copy and paste it into the original sprite sheet document.
This sounds like a lot of steps and it is...Hey All,
Thanks for posting :-)
Hi Chris Cox,
The PNG format out of Photoshop does not work in computer game graphics for some reason so the game artist use SuperPNG. To get SuperPNG to work it must have an alpha channel for the transparency to work in game engines like GameMaker & GarageGames.
HI Paul Riggott,
I am using a software tool like File Sticher called GlueIt and it is working great for me. But this is one extra step I am trying to remove to my art pipe-line.
Here is the current result in the GameMaker v7.0
Here is the my current work flow in Photoshop CS4 Extended -
Need help to get alternate or better way to write query
Hi,
I am on Oracle 11.2
DDL and sample data
create table tab1 -- 1 millions rows at any given time
id number not null,
ref_cd varchar2(64) not null,
key varchar2(44) not null,
ctrl_flg varchar2(1),
ins_date date
create table tab2 -- close to 100 million rows
id number not null,
ref_cd varchar2(64) not null,
key varchar2(44) not null,
ctrl_flg varchar2(1),
ins_date date,
upd_date date
insert into tab1 values (1,'ABCDEFG', 'XYZ','Y',sysdate);
insert into tab1 values (2,'XYZABC', 'DEF','Y',sysdate);
insert into tab1 values (3,'PORSTUVW', 'ABC','Y',sysdate);
insert into tab2 values (1,'ABCDEFG', 'WYZ','Y',sysdate);
insert into tab2 values (2,'tbVCCmphEbOEUWbxRKczvsgmzjhROXOwNkkdxWiPqDgPXtJhVl', 'ABLIOWNdj','Y',sysdate);
insert into tab2 values (3,'tbBCFkphEbOEUWbxATczvsgmzjhRQWOwNkkdxWiPqDgPXtJhVl', 'MQLIOWNdj','Y',sysdate);I need to get all rows from tab1 that does not match tab2 and any row from tab1 that matches ref_cd in tab2 but key is different.
Expected Query output
'ABCDEFG', 'WYZ'
'XYZABC', 'DEF'
'PORSTUVW', 'ABC'Existing Query
select
ref_cd,
key
from
select
ref_cd,
key
from
tab1, tab2
where
tab1.ref_cd = tab2.ref_cd and
tab1.key <> tab2.key
union
select
ref_cd,
key
from
tab1
where
not exists
select 1
from
tab2
where
tab2.ref_cd = tab1.ref_cd
);I am sure there will be an alternate way to write this query in better way. Appreciate if any of you gurus suggest alternative solution.
Thanks in advance.Hi,
user572194 wrote:
... DDL and sample data ...
create table tab2 -- close to 100 million rows
id number not null,
ref_cd varchar2(64) not null,
key varchar2(44) not null,
ctrl_flg varchar2(1),
ins_date date,
upd_date date
insert into tab2 values (1,'ABCDEFG', 'WYZ','Y',sysdate);
insert into tab2 values (2,'tbVCCmphEbOEUWbxRKczvsgmzjhROXOwNkkdxWiPqDgPXtJhVl', 'ABLIOWNdj','Y',sysdate);
insert into tab2 values (3,'tbBCFkphEbOEUWbxATczvsgmzjhRQWOwNkkdxWiPqDgPXtJhVl', 'MQLIOWNdj','Y',sysdate);
Thanks for posting the CREATE TABLE and INSERT statments. Remember why you go to all that trouble: so the people whop want to help you can re-create the problem and test their ideas. When you post statemets that don't work, it's just a waste of time.
None of the INSERT statements for tab2 work. Tab2 has 6 columns, but the INSERT statements only have 5 values.
Please test your code before you post it.
I need to get all rows from tab1 that does not match tab2 WHat does "match" mean in this case? Does it mean that tab1.ref_cd = tab2.ref_cd?
and any row from tab1 that matches ref_cd in tab2 but key is different.
Existing Query
select
ref_cd,
key
from
select
ref_cd,
key
from
tab1, tab2
where
tab1.ref_cd = tab2.ref_cd and
tab1.key <> tab2.key
union
select
ref_cd,
key
from
tab1
where
not exists
select 1
from
tab2
where
tab2.ref_cd = tab1.ref_cd
Does that really work? In the first branch of the UNION, you're referencing a column called key, but both tables involved have columns called key. I would expect that to cause an error.
Please test your code before you post it.
Right before UNION, did you mean
tab1.key != tab2.key? As you may have noticed, this site doesn't like to display the <> inequality operator. Always use the other (equivalent) inequality operator, !=, when posting here.
I am sure there will be an alternate way to write this query in better way. Appreciate if any of you gurus suggest alternative solution.Avoid UNION; it can be very inefficient.
Maybe you want something like this:
SELECT tab1.ref_cd
, tab1.key
FROM tab1
LEFT OUTER JOIN tab2 ON tab2.ref_cd = tab1.ref_cd
WHERE tab2.ref_cd IS NULL
OR tab2.key != tab1.key
; -
Help with XML - which is better - Help needed
Current version of Oracle:
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
I'm new to XML & this is my first post.
Background: I have a "few" relational tables which are designed to assist the form scraping and to store the values as Key-Value-Attribute from the UI capture. (the change to the design is not possible at this time). I've also built the "normalized" schema which will hold the normalized data from this form-scrapping schema.
In order to achive this: I plan on having (1) XML view which the UI will call and then it will be inserted/updated in the normalized schema (2) to be able to use the same XML by the BI publisher for reporting (3) end user query this form-scraping db to view as normalized data.
Following are my thoughts about the approach & please correct & guide if my understanding/approach is wrong.
After some good reading on this forum and other materials, I've come up with the below mentioned XML generation method. How can I convert this XML "record" such that it can satisfy the above stated.
output:
<?xml version="1.0"?>
<ROWSET>
<ROW>
<FORM_TYPE_ID>900</FORM_TYPE_ID>
<SYSTEM_NAME>HAZMAT_ENROLLMENT</SYSTEM_NAME>
<FORM_TYPE>ENR-HAZMAT</FORM_TYPE>
<FORM_ID>2371370</FORM_ID>
<SUBMISSION_TYPE_ID>60</SUBMISSION_TYPE_ID>
<FILING_DATE>29-APR-11</FILING_DATE>
<SECTION>
<SECTION_ROW>
<SECTION_ID>6750</SECTION_ID>
<SECTION_NAME>Personal Information</SECTION_NAME>
<ATTRIBUTE>
<ATTRIBUTE_ROW>
<SRC>FRM_RSP</SRC>
<ATTR_ID>30001</ATTR_ID>
<ATTR_NAME>ENROLLEE_FIRST_NAME</ATTR_NAME>
<ATTR_DESC>Enrollee's First Name</ATTR_DESC>
<ATTR_VAL>Test First Name</ATTR_VAL>
</ATTRIBUTE_ROW>
<ATTRIBUTE_ROW>
<SRC>FRM_RSP</SRC>
<ATTR_ID>30002</ATTR_ID>
<ATTR_NAME>ENROLLEE_MIDDLE_INIT</ATTR_NAME>
<ATTR_DESC>Enrollee's Middle Initial</ATTR_DESC>
<ATTR_VAL>Test Middle Initial</ATTR_VAL>
</ATTRIBUTE_ROW>
</SECTION_ROW>
</SECTION>
</ROW>
</ROWSET>
Code:
*(All REF_% tables are lookup and FRM_RESPONSE is a KVA capture table and TBL_RESPONSE is also a KVA capture only used if the input is table wise (rows X columns))*
FORM is made up of SECTIONs (1-to-many), SECTIONs contain ATTR_IDs (question ids, 1-to-many), %RESPONSE is always linked to an ATTR_ID
CREATE OR REPLACE function DEVDBA.gen_xmlstr (p_form_id form.form_id%type) return clob as
str clob := '
SELECT rft.form_type_id, rft.system_name,rft.form_type, f.form_id, f.submission_type_id, f.sp_id,
f.filing_date, f.tracking_num, f.spplmntl_num, f.parent_form_id, f.created_date, f.created_by,
f.updated_date, f.updated_by,
CURSOR(SELECT rs.section_id,
rs.section_name,
CURSOR(SELECT ''FRM_RSP'' src, fr.frm_response_id, ra.attr_id, ra.attr_name, ra.attr_desc, fr.attr_val
FROM frm_response fr, ref_attr ra, ref_section_attr rsa
WHERE fr.form_id = f.form_id
AND fr.attr_id = rsa.attr_id
AND fr.form_section_id = rsa.form_section_id
AND fr.attr_id = ra.attr_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP1'' src, tr.tbl_response_id, tr.col_attr_id1, ra.attr_name, ra.attr_desc, col_attr_val1
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id1 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP2'' src, tr.tbl_response_id, tr.col_attr_id2, ra.attr_name, ra.attr_desc, col_attr_val2
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id2 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP3'' src, tr.tbl_response_id, TO_NUMBER(tr.col_attr_id3), ra.attr_name, ra.attr_desc, col_attr_val3
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND TO_NUMBER(tr.col_attr_id3) = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP4'' src, tr.tbl_response_id, tr.col_attr_id4, ra.attr_name, ra.attr_desc, col_attr_val4
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id4 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP5'' src, tr.tbl_response_id, tr.col_attr_id5, ra.attr_name, ra.attr_desc, col_attr_val5
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id5 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP6'' src, tr.tbl_response_id, tr.col_attr_id6, ra.attr_name, ra.attr_desc, col_attr_val6
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id6 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP7'' src, tr.tbl_response_id, tr.col_attr_id7, ra.attr_name, ra.attr_desc, col_attr_val7
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id7 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP8'' src, tr.tbl_response_id, tr.col_attr_id8, ra.attr_name, ra.attr_desc, col_attr_val8
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id8 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP9'' src, tr.tbl_response_id, tr.col_attr_id9, ra.attr_name, ra.attr_desc, col_attr_val9
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id9 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
UNION
SELECT ''TBL_RSP10'' src, tr.tbl_response_id, tr.col_attr_id10, ra.attr_name, ra.attr_desc, col_attr_val10
FROM tbl_response tr, ref_attr ra, ref_section_attr rsa
WHERE tr.form_id = f.form_id
AND tr.col_attr_id10 = ra.attr_id
AND tr.form_section_id = rsa.form_section_id
AND rsa.form_section_id = rfs.form_section_id
attribute
FROM ref_section rs, ref_form_section rfs
WHERE rs.section_id = rfs.section_id
AND rfs.form_type_id = f.form_type_id
ORDER BY rs.section_id, rfs.form_section_id)
section
FROM ref_form_type rft, form f
WHERE rft.form_type_id = f.form_type_id
AND f.form_id = ' || p_form_id; --2371370'';
begin
return dbms_xmlgen.getxml(str);
end gen_xmlstr;
Invocation:
select gen_xmlstr(2371370)
from dual;
Below is the execution plan. Can this be better?
Execution Plan
Plan hash value: 2652539008
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 75 | 3 (0)| 00:00:01 |
| 1 | SORT UNIQUE | | 11 | 1024 | 40 (88)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
| 3 | NESTED LOOPS | | | | | |
| 4 | NESTED LOOPS | | 1 | 91 | 5 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 82 | 3 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| FRM_RESPONSE | 1 | 25 | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | FK3_FRM_RESPONSE | 20 | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID| REF_ATTR | 1 | 57 | 1 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | FK2_REF_SECTION_ATTR | 2 | | 1 (0)| 00:00:01 |
|* 11 | TABLE ACCESS BY INDEX ROWID | REF_SECTION_ATTR | 1 | 9 | 2 (0)| 00:00:01
| 12 | NESTED LOOPS | | | | | |
| 13 | NESTED LOOPS | | 1 | 105 | 2 (0)| 00:00:01 |
| 14 | NESTED LOOPS | | 1 | 48 | 2 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 16 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 44 | 1 (0)| 00:00:01 |
|* 17 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 18 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 19 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 20 | NESTED LOOPS | | | | | |
| 21 | NESTED LOOPS | | 1 | 100 | 2 (0)| 00:00:01 |
| 22 | NESTED LOOPS | | 1 | 43 | 2 (0)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 24 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 39 | 1 (0)| 00:00:01 |
|* 25 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 26 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 27 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 28 | NESTED LOOPS | | | | | |
| 29 | NESTED LOOPS | | 1 | 86 | 3 (0)| 00:00:01 |
| 30 | NESTED LOOPS | | 1 | 29 | 2 (0)| 00:00:01 |
|* 31 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 32 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 25 | 1 (0)| 00:00:01 |
|* 33 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 34 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 35 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 1 (0)| 00:00:01 |
| 36 | NESTED LOOPS | | | | | |
| 37 | NESTED LOOPS | | 1 | 93 | 2 (0)| 00:00:01 |
| 38 | NESTED LOOPS | | 1 | 36 | 2 (0)| 00:00:01 |
|* 39 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 40 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 32 | 1 (0)| 00:00:01 |
|* 41 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 42 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 43 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 44 | NESTED LOOPS | | | | | |
| 45 | NESTED LOOPS | | 1 | 93 | 2 (0)| 00:00:01 |
| 46 | NESTED LOOPS | | 1 | 36 | 2 (0)| 00:00:01 |
|* 47 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 48 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 32 | 1 (0)| 00:00:01 |
|* 49 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 50 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 51 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 52 | NESTED LOOPS | | | | | |
| 53 | NESTED LOOPS | | 1 | 90 | 2 (0)| 00:00:01 |
| 54 | NESTED LOOPS | | 1 | 33 | 2 (0)| 00:00:01 |
|* 55 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 56 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 29 | 1 (0)| 00:00:01 |
|* 57 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 58 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 59 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 60 | NESTED LOOPS | | | | | |
| 61 | NESTED LOOPS | | 1 | 95 | 2 (0)| 00:00:01 |
| 62 | NESTED LOOPS | | 1 | 38 | 2 (0)| 00:00:01 |
|* 63 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 64 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 34 | 1 (0)| 00:00:01 |
|* 65 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 66 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 67 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 68 | NESTED LOOPS | | | | | |
| 69 | NESTED LOOPS | | 1 | 90 | 2 (0)| 00:00:01 |
| 70 | NESTED LOOPS | | 1 | 33 | 2 (0)| 00:00:01 |
|* 71 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 72 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 29 | 1 (0)| 00:00:01 |
|* 73 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 74 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 75 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 76 | NESTED LOOPS | | | | | |
| 77 | NESTED LOOPS | | 1 | 90 | 2 (0)| 00:00:01 |
| 78 | NESTED LOOPS | | 1 | 33 | 2 (0)| 00:00:01 |
|* 79 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 80 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 29 | 1 (0)| 00:00:01 |
|* 81 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 82 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 83 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 84 | NESTED LOOPS | | | | | |
| 85 | NESTED LOOPS | | 1 | 91 | 2 (0)| 00:00:01 |
| 86 | NESTED LOOPS | | 1 | 34 | 2 (0)| 00:00:01 |
|* 87 | INDEX RANGE SCAN | FK1_REF_SECTION_ATTR | 9 | 36 | 1 (0)| 00:00:01 |
|* 88 | TABLE ACCESS BY INDEX ROWID| TBL_RESPONSE | 1 | 30 | 1 (0)| 00:00:01 |
|* 89 | INDEX RANGE SCAN | FK1_TBL_RESPONSE | 1 | | 0 (0)| 00:00:01 |
|* 90 | INDEX UNIQUE SCAN | PK_REF_ATTR | 1 | | 0 (0)| 00:00:01 |
| 91 | TABLE ACCESS BY INDEX ROWID | REF_ATTR | 1 | 57 | 0 (0)| 00:00:01 |
| 92 | SORT ORDER BY | | 20 | 1040 | 7 (29)| 00:00:01 |
|* 93 | HASH JOIN | | 20 | 1040 | 6 (17)| 00:00:01 |
| 94 | TABLE ACCESS BY INDEX ROWID | REF_FORM_SECTION | 20 | 200 | 2 (0)| 00:00:01 |
|* 95 | INDEX RANGE SCAN | FK1_FORM_SECTION | 20 | | 1 (0)| 00:00:01 |
| 96 | TABLE ACCESS FULL | REF_SECTION | 100 | 4200 | 3 (0)| 00:00:01 |
| 97 | NESTED LOOPS | | 1 | 75 | 3 (0)| 00:00:01 |
| 98 | TABLE ACCESS BY INDEX ROWID | FORM | 1 | 59 | 2 (0)| 00:00:01 |
|* 99 | INDEX UNIQUE SCAN | PK_FORM | 1 | | 1 (0)| 00:00:01 |
| 100 | TABLE ACCESS BY INDEX ROWID | REF_FORM_TYPE | 5 | 80 | 1 (0)| 00:00:01 |
|*101 | INDEX UNIQUE SCAN | PK_REF_FORM_TYPE | 1 | | 0 (0)| 00:00:01 |
Predicate Information (identified by operation id):
6 - filter("FR"."FORM_SECTION_ID"=:B1)
7 - access("FR"."FORM_ID"=:B1)
9 - access("FR"."ATTR_ID"="RA"."ATTR_ID")
10 - access("FR"."ATTR_ID"="RSA"."ATTR_ID")
11 - filter("RSA"."FORM_SECTION_ID"=:B1 AND "FR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
15 - access("RSA"."FORM_SECTION_ID"=:B1)
16 - filter("TR"."COL_ATTR_ID1" IS NOT NULL AND "TR"."FORM_ID"=:B1)
17 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
18 - access("TR"."COL_ATTR_ID1"="RA"."ATTR_ID")
23 - access("RSA"."FORM_SECTION_ID"=:B1)
24 - filter("TR"."COL_ATTR_ID2" IS NOT NULL AND "TR"."FORM_ID"=:B1)
25 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
26 - access("TR"."COL_ATTR_ID2"="RA"."ATTR_ID")
31 - access("RSA"."FORM_SECTION_ID"=:B1)
32 - filter("TR"."FORM_ID"=:B1)
33 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
34 - access("RA"."ATTR_ID"=TO_NUMBER("TR"."COL_ATTR_ID3"))
39 - access("RSA"."FORM_SECTION_ID"=:B1)
40 - filter("TR"."COL_ATTR_ID4" IS NOT NULL AND "TR"."FORM_ID"=:B1)
41 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
42 - access("TR"."COL_ATTR_ID4"="RA"."ATTR_ID")
47 - access("RSA"."FORM_SECTION_ID"=:B1)
48 - filter("TR"."COL_ATTR_ID5" IS NOT NULL AND "TR"."FORM_ID"=:B1)
49 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
50 - access("TR"."COL_ATTR_ID5"="RA"."ATTR_ID")
55 - access("RSA"."FORM_SECTION_ID"=:B1)
56 - filter("TR"."COL_ATTR_ID6" IS NOT NULL AND "TR"."FORM_ID"=:B1)
57 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
58 - access("TR"."COL_ATTR_ID6"="RA"."ATTR_ID")
63 - access("RSA"."FORM_SECTION_ID"=:B1)
64 - filter("TR"."COL_ATTR_ID7" IS NOT NULL AND "TR"."FORM_ID"=:B1)
65 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
66 - access("TR"."COL_ATTR_ID7"="RA"."ATTR_ID")
71 - access("RSA"."FORM_SECTION_ID"=:B1)
72 - filter("TR"."COL_ATTR_ID8" IS NOT NULL AND "TR"."FORM_ID"=:B1)
73 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
74 - access("TR"."COL_ATTR_ID8"="RA"."ATTR_ID")
79 - access("RSA"."FORM_SECTION_ID"=:B1)
80 - filter("TR"."COL_ATTR_ID9" IS NOT NULL AND "TR"."FORM_ID"=:B1)
81 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
82 - access("TR"."COL_ATTR_ID9"="RA"."ATTR_ID")
87 - access("RSA"."FORM_SECTION_ID"=:B1)
88 - filter("TR"."COL_ATTR_ID10" IS NOT NULL AND "TR"."FORM_ID"=:B1)
89 - access("TR"."FORM_SECTION_ID"=:B1)
filter("TR"."FORM_SECTION_ID"="RSA"."FORM_SECTION_ID")
90 - access("TR"."COL_ATTR_ID10"="RA"."ATTR_ID")
93 - access("RS"."SECTION_ID"="RFS"."SECTION_ID")
95 - access("RFS"."FORM_TYPE_ID"=:B1)
99 - access("F"."FORM_ID"=2371370)
101 - access("RFT"."FORM_TYPE_ID"="F"."FORM_TYPE_ID")
What tools/techniques are available to generate the XSLT? (use XMLSpy etc?), how to create a such that it can be as simple as "select from v_xml_view;" and be able to replace * with column names?*
==============================
I've also tried the *SQL-XML extensions* but am stuck with the UNION PART (help is requested on how to union columns within the XMLAgg).
{code}
select
xmlelement ("System",
xmlforest(rft.form_type_id as "FormTypeID", rft.system_name as "SystemName", rft.form_type as "FormType", f.form_id as "FormID"),
xmlelement("Sections",
(select xmlagg(xmlelement("Section",
xmlforest(rs.section_id as "SectionID", rs.section_name as "SectionName"),
xmlelement("Attributes",
(select xmlagg(xmlelement("Attr",
xmlforest (rsa.attr_id as "AttrID", ra.attr_name as "AttrName", ra.attr_desc as "Attr_desc", fr.attr_val as "AttrValue")
) -- "attr"
) --xmlagg attr
from ref_section_attr rsa, ref_attr ra, frm_response fr
where rsa.attr_id = ra.attr_id
and rsa.form_section_id = rfs.form_section_id
and fr.form_id = f.form_id
and fr.form_section_id = rsa.form_section_id
and fr.attr_id = rsa.attr_id
) --attributes select
) -- attributes
) -- section elements
) -- xmlagg
from ref_section rs, ref_form_section rfs
where rs.section_id = rfs.section_id
and rfs.form_type_id = f.form_type_id
) -- select query
) -- sections
) -- system
as str
from ref_form_type rft, FORM f
where rft.form_type_id = f.form_type_id
and f.form_id = 2371420;
{code}
*and the output is like:
(I don't know how to format this for easy viewing!)*
{code}
<System><FormTypeID>900</FormTypeID><SystemName>HAZMAT_ENROLLMENT</SystemName><FormType>ENR-HAZMAT</FormType><FormID>2371420</FormID><Sections><Section><SectionID>6750</SectionID><SectionName>Personal Information</SectionName><Attributes><Attr><AttrID>30001</AttrID><AttrName>ENROLLEE_FIRST_NAME</AttrName><Attr_desc>Enrollee's First Name</Attr_desc><AttrValue>Enroll</AttrValue></Attr><Attr><AttrID>30002</AttrID><AttrName>ENROLLEE_MIDDLE_INIT</AttrName><Attr_desc>Enrollee's Middle Initial</Attr_desc><AttrValue> </AttrValue></Attr><Attr><AttrID>30003</AttrID><AttrName>ENROLLEE_LAST_NAME</AttrName><Attr_desc>Enrollee's Last Name</Attr_desc><AttrValue>User11</AttrValue></Attr><Attr><AttrID>30004</AttrID><AttrName>ENROLLEE_WORK_PHONE</AttrName><Attr_desc>Enrollee's Work Phone Number</Attr_desc><AttrValue>(703) 222-4444</AttrValue></Attr><Attr><AttrID>30005</AttrID><AttrName>ENROLLEE_FAX</AttrName><Attr_desc>Enrollee Fax Number</Attr_desc><AttrValue> </AttrValue></Attr><Attr><AttrID>30006</AttrID><AttrName>ENROLLEE_EXT</AttrName><Attr_desc>Enrollee's Work Extension</Attr_desc><AttrValue> </AttrValue></Attr><Attr><AttrID>30007</AttrID><AttrName>ENROLLEE_EMAIL</AttrName><Attr_desc>Enrollee's Email</Attr_desc><AttrValue>[email protected]</AttrValue></Attr><Attr><AttrID>30023</AttrID><AttrName>POC_TYPE</AttrName><Attr_desc>Point of Contact Type</Attr_desc><AttrValue>Consultant</AttrValue></Attr><Attr><AttrID>30008</AttrID><AttrName>ENROLLEE_MAIL_ADDR_1</AttrName><Attr_desc>Enrollee's Mailing Address #1</Attr_desc><AttrValue>123 Main St</AttrValue></Attr><Attr><AttrID>30009</AttrID><AttrName>ENROLLEE_MAIL_ADDR_2</AttrName><Attr_desc>Enrollee's Mailing Address #2</Attr_desc><AttrValue> </AttrValue></Attr><Attr><AttrID>30010</AttrID><AttrName>ENROLLEE_CITY</AttrName><Attr_desc>Enrollee's City</Attr_desc><AttrValue>Herndon</AttrValue></Attr><Attr><AttrID>30011</AttrID><AttrName>ENROLLEE_STATE</AttrName><Attr_desc>Enrollee's State</Attr_desc><AttrValue>VA</AttrValue></Attr><Attr><AttrID>30012</AttrID><AttrName>ENROLLEE_ZIP</AttrName><Attr_desc>Enrollee's Zip</Attr_desc><AttrValue>28408</AttrValue></Attr><Attr><AttrID>30013</AttrID><AttrName>ENROLLEE_USER_NAME</AttrName><Attr_desc>Enrollee's User Name</Attr_desc><AttrValue>enrolluser11</AttrValue></Attr></Attributes></Section><Section><SectionID>6800</SectionID><SectionName>Company Information</SectionName><Attributes><Attr><AttrID>30014</AttrID><AttrName>DUN_BRADSTREET_NUM</AttrName><Attr_desc>Company's Dun and Bradstreet #</Attr_desc><AttrValue>198455201</AttrValue></Attr></Attributes></Section><Section><SectionID>6850</SectionID><SectionName>Points of Contact</SectionName><Attributes></Attributes></Section><Section><SectionID>6900</SectionID><SectionName>Enrollment Verification</SectionName><Attributes></Attributes></Section><Section><SectionID>6950</SectionID><SectionName>Enrollment Confirmation</SectionName><Attributes></Attributes></Section></Sections></System>
{code}
*The execution plan:*
{code}
Execution Plan
Plan hash value: 2641045985
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------Thanks for the data.
I thought you would have included data from TBL_RESPONSE, as the interesting part is how to deal with this "special" design ;)
So, to run some tests, I've generated the following data for FORM_SECTION_ID 5350 and 5360 :
insert into tbl_response (FORM_ID, FORM_SECTION_ID, COL_ATTR_ID1, COL_ATTR_VAL1, COL_ATTR_ID2, COL_ATTR_VAL2, COL_ATTR_ID3, COL_ATTR_VAL3, COL_ATTR_ID4, COL_ATTR_VAL4, COL_ATTR_ID5, COL_ATTR_VAL5, COL_ATTR_ID6, COL_ATTR_VAL6, COL_ATTR_ID7, COL_ATTR_VAL7, COL_ATTR_ID8, COL_ATTR_VAL8, COL_ATTR_ID9, COL_ATTR_VAL9, COL_ATTR_ID10, COL_ATTR_VAL10)
values (2371420, 5350, 30000, '05/03/2011', 30001, 'John', '30002', 'J', 30003, 'Doe', 30004, '(555) 123-1234', 30005, '(555) 123-1235', 30006, '1234567', 30007, '[email protected]', 30008, '10 Maple Street', 30009, '.');
insert into tbl_response (FORM_ID, FORM_SECTION_ID, COL_ATTR_ID1, COL_ATTR_VAL1, COL_ATTR_ID2, COL_ATTR_VAL2, COL_ATTR_ID3, COL_ATTR_VAL3, COL_ATTR_ID4, COL_ATTR_VAL4, COL_ATTR_ID5, COL_ATTR_VAL5, COL_ATTR_ID6, COL_ATTR_VAL6, COL_ATTR_ID7, COL_ATTR_VAL7, COL_ATTR_ID8, COL_ATTR_VAL8, COL_ATTR_ID9, COL_ATTR_VAL9, COL_ATTR_ID10, COL_ATTR_VAL10)
values (2371420, 5350, 30011, 'MA', 30012, '02668', '30013', 'jdoe', null, '', null, '', null, '', null, '', null, '', null, '', null, '');
insert into tbl_response (FORM_ID, FORM_SECTION_ID, COL_ATTR_ID1, COL_ATTR_VAL1, COL_ATTR_ID2, COL_ATTR_VAL2, COL_ATTR_ID3, COL_ATTR_VAL3, COL_ATTR_ID4, COL_ATTR_VAL4, COL_ATTR_ID5, COL_ATTR_VAL5, COL_ATTR_ID6, COL_ATTR_VAL6, COL_ATTR_ID7, COL_ATTR_VAL7, COL_ATTR_ID8, COL_ATTR_VAL8, COL_ATTR_ID9, COL_ATTR_VAL9, COL_ATTR_ID10, COL_ATTR_VAL10)
values (2371420, 5360, 30014, '123456789', 30015, 'My Company', '30016', '50 Main Street', 30017, '.', 30018, 'Marstons Mills', 30019, 'MA', 30020, '02648', 30021, '(555) 123-1236', null, '', null, '');And here's the query :
WITH attr_unpivot AS (
SELECT form_section_id
, attr_val
FROM (
SELECT form_section_id
, XMLForest(col_attr_id1 as "AttrID", col_attr_val1 as "AttrValue") as attr01
, XMLForest(col_attr_id2 as "AttrID", col_attr_val2 as "AttrValue") as attr02
, XMLForest(col_attr_id3 as "AttrID", col_attr_val3 as "AttrValue") as attr03
, XMLForest(col_attr_id4 as "AttrID", col_attr_val4 as "AttrValue") as attr04
, XMLForest(col_attr_id5 as "AttrID", col_attr_val5 as "AttrValue") as attr05
, XMLForest(col_attr_id6 as "AttrID", col_attr_val6 as "AttrValue") as attr06
, XMLForest(col_attr_id7 as "AttrID", col_attr_val7 as "AttrValue") as attr07
, XMLForest(col_attr_id8 as "AttrID", col_attr_val8 as "AttrValue") as attr08
, XMLForest(col_attr_id9 as "AttrID", col_attr_val9 as "AttrValue") as attr09
, XMLForest(col_attr_id10 as "AttrID", col_attr_val10 as "AttrValue") as attr10
FROM tbl_response
WHERE form_id = 2371420
UNPIVOT (
attr_val FOR attr_pos IN (attr01,attr02,attr03,attr04,attr05,attr06,attr07,attr08,attr09,attr10)
UNION ALL
SELECT form_section_id
, XMLForest(fr.attr_id as "AttrID", fr.attr_val as "AttrValue")
FROM frm_response fr
WHERE fr.form_id = 2371420
SELECT XMLElement("System",
XMLForest(
rft.form_type_id as "FormTypeID"
, rft.system_name as "SystemName"
, rft.form_type as "FormType"
, f.form_id as "FormID"
, XMLElement("Sections",
SELECT XMLAgg(
XMLElement("Section",
XMLForest(
rs.section_id as "SectionID"
, rs.section_name as "SectionName"
, XMLElement("Attributes",
SELECT XMLAgg(
XMLElement("Attr",
XMLForest(
ra.attr_desc as "AttrDesc"
, ra.attr_name as "AttrName"
, v.attr_val
FROM attr_unpivot v
JOIN ref_section_attr rsa ON rsa.attr_id = extractValue(v.attr_val,'AttrID')
AND rsa.form_section_id = v.form_section_id
JOIN ref_attr ra ON ra.attr_id = rsa.attr_id
WHERE rsa.form_section_id = rfs.form_section_id
FROM ref_section rs
JOIN ref_form_section rfs ON rs.section_id = rfs.section_id
WHERE rfs.form_type_id = f.form_type_id
) as xmldoc
FROM ref_form_type rft
JOIN form f ON rft.form_type_id = f.form_type_id
WHERE f.form_id = 2371420
;The WITH clause builds a normalized result set out of TBL_RESPONSE and FRM_RESPONSE.
That result set is then joined in the main query for each section of the form.
The resulting XML document looks like :
<System>
<FormTypeID>900</FormTypeID>
<SystemName>ENROLLMENT</SystemName>
<FormType>ENR</FormType>
<FormID>2371420</FormID>
<Sections>
<Section>
<SectionID>6750</SectionID>
<SectionName>Personal Information</SectionName>
<Attributes>
<Attr>
<AttrDesc>Enrollment Date</AttrDesc>
<AttrName>ENROLLMENT_DATE</AttrName>
<AttrID>30000</AttrID>
<AttrValue>05/03/2011</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's First Name</AttrDesc>
<AttrName>ENROLLEE_FIRST_NAME</AttrName>
<AttrID>30001</AttrID>
<AttrValue>John</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Middle Initial</AttrDesc>
<AttrName>ENROLLEE_MIDDLE_INIT</AttrName>
<AttrID>30002</AttrID>
<AttrValue>J</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Last Name</AttrDesc>
<AttrName>ENROLLEE_LAST_NAME</AttrName>
<AttrID>30003</AttrID>
<AttrValue>Doe</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Work Phone Number</AttrDesc>
<AttrName>ENROLLEE_WORK_PHONE</AttrName>
<AttrID>30004</AttrID>
<AttrValue>(555) 123-1234</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee Fax Number</AttrDesc>
<AttrName>ENROLLEE_FAX</AttrName>
<AttrID>30005</AttrID>
<AttrValue>(555) 123-1235</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Work Extension</AttrDesc>
<AttrName>ENROLLEE_EXT</AttrName>
<AttrID>30006</AttrID>
<AttrValue>1234567</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Email</AttrDesc>
<AttrName>ENROLLEE_EMAIL</AttrName>
<AttrID>30007</AttrID>
<AttrValue>[email protected]</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Mailing Address #1</AttrDesc>
<AttrName>ENROLLEE_MAIL_ADDR_1</AttrName>
<AttrID>30008</AttrID>
<AttrValue>10 Maple Street</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Mailing Address #2</AttrDesc>
<AttrName>ENROLLEE_MAIL_ADDR_2</AttrName>
<AttrID>30009</AttrID>
<AttrValue>.</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's State</AttrDesc>
<AttrName>ENROLLEE_STATE</AttrName>
<AttrID>30011</AttrID>
<AttrValue>MA</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's Zip</AttrDesc>
<AttrName>ENROLLEE_ZIP</AttrName>
<AttrID>30012</AttrID>
<AttrValue>02668</AttrValue>
</Attr>
<Attr>
<AttrDesc>Enrollee's User Name</AttrDesc>
<AttrName>ENROLLEE_USER_NAME</AttrName>
<AttrID>30013</AttrID>
<AttrValue>jdoe</AttrValue>
</Attr>
</Attributes>
</Section>
<Section>
<SectionID>6800</SectionID>
<SectionName>Company Information</SectionName>
<Attributes>
<Attr>
<AttrDesc>Company's DB #</AttrDesc>
<AttrName>DBNUM</AttrName>
<AttrID>30014</AttrID>
<AttrValue>123456789</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company Name</AttrDesc>
<AttrID>30015</AttrID>
<AttrValue>My Company</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company Adress #1</AttrDesc>
<AttrID>30016</AttrID>
<AttrValue>50 Main Street</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company Adress #2</AttrDesc>
<AttrID>30017</AttrID>
<AttrValue>.</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company City</AttrDesc>
<AttrID>30018</AttrID>
<AttrValue>Marstons Mills</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company State</AttrDesc>
<AttrID>30019</AttrID>
<AttrValue>MA</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company Zip</AttrDesc>
<AttrID>30020</AttrID>
<AttrValue>02648</AttrValue>
</Attr>
<Attr>
<AttrDesc>Company Phone</AttrDesc>
<AttrID>30021</AttrID>
<AttrValue>(555) 123-1236</AttrValue>
</Attr>
</Attributes>
</Section>
<Section>
<SectionID>6850</SectionID>
<SectionName>Points of Contact</SectionName>
<Attributes/>
</Section>
<Section>
<SectionID>6900</SectionID>
<SectionName>Enrollment Verification</SectionName>
<Attributes/>
</Section>
<Section>
<SectionID>6950</SectionID>
<SectionName>Enrollment Confirmation</SectionName>
<Attributes/>
</Section>
</Sections>
</System> -
I need someone to verify with me if the CPU ratio selection under the Frequency/Voltage portion of the bios is stated as locked ??
I am having an unlocked CPU, so this selection allow me to change the values from default to 0x - 15x. But when I change the CPU ratio selection to any other values other then default, the system won't boot, checking the debug LED ( 3 red and 1 yellow) meaning setting up chitset or something like that.
As for the FSB, when set to auto, it is 133Mhz. Which is correct cause this processor is actually a P4 2.4B 2.4Ghz fsb = 133.
On top of that, the default multiplier is 12x which doesn't make sense. The cpu ratio selection is also skrewed, since the range is from 0 - 15 and not 14 - 24 ??? this is really weird !!!
Regards,
Jen Sen ;(Well actually, I got it from a friend... ehhehe Where he got it is a secret... can't help you though... but if you have a 645E max 2...please check for me if the cpu ratio selection is stated as locked ?? or can you change it... or is it default ??
-
Need a help with this max query
select SEARCH_ID, SEARCH_KEYWORD, COUNT, ASSET_TYPE from RELEVANCY_TABLE
where SEARCH_KEYWORD = 'search_keyword'
and ASSET_TYPE is not null
558
search_keyword
3
desk
559
search_keyword
7
table
I actually need to get the asset_type for which count is the maximum. In this case it should be 'table'. Any help?adfSonal wrote:
Is there any other way? I have to write this query in Java. So I will prefer avoiding rank or such functions.
Won't I get the desired result just using select, where, max, rownum clauses?
What do you mean by "I have to write this query in Java"? Any ways the query will be run against a Oracle DB, correct?
Any ways using ROWNUM
select *
from (
select search_id
, search_keyword
, count
, asset_type
from relevancy_table
where search_keyword = 'search_keyword'
and asset_type is not null
order
by count desc
where rownum = 1 -
Help to get max date of the group
Hi, How I can get the max(date1) for the group on the basis of Code1,Code2,Code3.
Code1 Code2 Code3 Date1 RTCODE
A A1 A2 1/1/2012 SER
A A1 A2 1/1/2013 SER
A A1 A2 1/1/2015 TER
B B1 B2 1/1/2011 JTS
B B1 B2 1/1/2012 JTR
C C1 C2 1/1/2010 HYR
C C1 C2 1/1/2011 JST
Expected results from query should be:
Code1 Code2 Code3 Date1 RTCODE
A A1 A2 1/1/2015 TER
B B1 B2 1/1/2012 JTR
C C1 C2 1/1/2011 JSTHi,
You can try this:
CREATE TABLE #T
CODE1 VARCHAR(5),
CODE2 VARCHAR(5),
CODE3 VARCHAR(5),
DATE1 DATE,
RTCODE VARCHAR(5)
--DROP TABLE #T
INSERT INTO #T
VALUES
('A','A1','A2','20120101','SER'),
('A','A1','A2','20130101','SER'),
('A','A1','A2','20150101','TER'),
('B','B1','B2','20110101','JTS'),
('B','B1','B2','20120101','JTR'),
('C','C1','C2','20100101','HYR'),
('C','C1','C2','20110101','JST');
--TRUNCATE TABLE #T
WITH TEST AS
SELECT CODE1, CODE2, CODE3, MAX(DATE1) AS DT_MAX
FROM #T
GROUP BY CODE1, CODE2, CODE3
SELECT T.CODE1,T.CODE2, T.CODE3, T.DT_MAX,#T.RTCODE
FROM TEST AS T
INNER JOIN #T ON T.CODE1=#T.CODE1
AND T.CODE2=#T.CODE2
AND T.CODE3=#T.CODE3
AND T.DT_MAX=#T.DATE1
ORDER BY T.CODE1,T.CODE2,T.CODE3
Regards,
Reshma
Please Vote as Helpful if an answer is helpful and/or Please mark Proposed as Answer or Mark As Answer when question is answered
Maybe you are looking for
-
Analysis Authorization (Role, Profile and Direct Assignments)
<b>Analysis Authorization Question:</b> 1) In BW 3.x environment, customers have used Role Maintenance Process to assign proper object level security and then assign to the users. 2) Most of the places R/3 security team takes over support/adm
-
BPM for Weblogic configuration is failed
1, I install BPM for Weblogic. 2, I create a domain for weblogic using config tool and start it. 3, I create a new directory. However, the configuration is failed. The BPM for weblogic is installed in XP and the window of selecting JDK is not pop out
-
Number of contacts in Smart Group
i have a smart group set up for our store customers. it has gone over the relay limit for our email provider and i am looking at other options. the problem is that pricing is based on the number of folks in your contact list. i could print the group
-
Planned Cost is taken from Actual Cost even through there is Baseline Cost
Hi All, Responsibility: Project Super User Create Project with fully shared structure Enter planned cost for 25000 against Task (Define Project scope in detail) with Financial Element as Resource and baseline the work plan. Now enter the actual cost
-
Help please! CC desktop app does not see latest Adobe Muse!
I have Muse installed for many months now and would like to update to the latest version of Muse. The CC desktop app maintains that my Muse is up-to-date! Can't be. Please help!