fhg
Volume 8, Number 17 -- April 30, 2008

Multiformat SQL Data Sets

Published: April 30, 2008

Hey, Ted:

DDS-defined logical files can have multiple record formats, each one of them coming from different physical files of different types of data. I would like to do the same sort of thing in SQL. That is, I want to retrieve all the records from one file followed by all the records from a second file, grouped by one or more common key fields. This is not a join, and it doesn't seem like a union either, because the two data sets are so different. Am I trying to do the impossible?

--David


What you're doing may be unusual, but it's not unrealistic. You're right that you don't need a join. Despite the difference in the two types of data, you need a union. Since both tables have columns that have no counterpart in the other one, you'll need to include nulls or default values as placeholders. I can explain this with a simple example.

Let's say that we have a table of items that customers have ordered from us.

create table orders
   (Order  dec(5),          
    Item   char(4),         
    Qty    dec(3))     
     
insert into orders values
  (201, 'A946',  5),       
  (203, 'B212',  7),       
  (207, 'A104', 12),       
  (210, 'B212',  4),       
  (211, 'B212',  4)        

We have another table that shows where items are stored in the warehouse.

create table inventory
   (Item      char(4),         
    Location  char(5),         
    Qty       dec(3))          

insert into inventory values
   ('A104', '1103B', 20),     
   ('A104', '1412B',  6),     
   ('A726', '0902A',  4),     
   ('B212', '0312C',  8),     
   ('B212', '0404B',  8),     
   ('B212', '0411C',  6)      

Here's how we might combine the data into one set.

select ord.item, 'A' as ID,                
       ord.order, ord.qty as OrdQty,       
       cast(null as char(5)) as Loc,       
       cast(null as dec(3)) as LocQty      
  from orders as ord
union all
select inv.item, 'B', cast(null as dec(5)),
       cast(null as dec(3)),               
       inv.location, inv.qty               
  from inventory as inv                  
order by 1,2,3,5

Now take a look at the result, and then I'll explain the query in a bit more detail.

ITEM  ID   ORDER   ORDQTY  LOC    LOCQTY
====  ==   =====   ======  =====  ======
A104  A      207       12  -          -
A104  B        -        -  1103B     20 
A104  B        -        -  1412B      6 
A726  B        -        -  0902A      4 
A946  A      201       5   -          -
B212  A      203       7   -          -
B212  A      210       4   -          -
B212  A      211       4   -          -
B212  B        -       -   0312C      8 
B212  B        -       -   0404B      8 
B212  B        -       -   0411C      6

The first SELECT (shown below) retrieves order information. Notice that the location and location quantity columns are left null, since they don't exist in the orders. Also notice that I have forced an "A" into the second column, in order to sort the data and also to identify the row as an order row.

select ord.item, 'A' as ID,                
       ord.order, ord.qty as OrdQty,       
       cast(null as char(5)) as Loc,       
       cast(null as dec(3)) as LocQty      
  from orders as ord                     

The second SELECT retrieves inventory information. Notice that the order fields are loaded with nulls.

select inv.item, 'B', cast(null as dec(5)),
       cast(null as dec(3)),               
       inv.location, inv.qty               
  from inventory as inv                  

The second column identifies each type of record and aids in sorting the data properly. I forced an "A" into order records and a "B" into inventory records. If I were to embed this statement in an RPG program, for example, my program could use this field to identify the type of data in a row.

If you don't want to deal with nulls, you can use blanks and zeros instead, as the following query illustrates.

select ord.item, 'A' as ID,           
       ord.order, ord.qty as OrdQty,  
       ' ' as Loc,                    
       0 as LocQty                    
  from orders as ord                
union all                             
select inv.item, 'B', 0, 0,           
       inv.location, inv.qty          
  from inventory as inv             
order by 1,2,3,5

ITEM  ID   ORDER   ORDQTY   LOC   LOCQTY
====  ==   =====   ======  =====  ======
A104  A      207       12              0
A104  B        0        0  1103B      20
A104  B        0        0  1412B       6
A726  B        0        0  0902A       4
A946  A      201        5              0
B212  A      203        7              0
B212  A      210        4              0
B212  A      211        4              0
B212  B        0        0  0312C       8
B212  B        0        0  0404B       8
B212  B        0        0  0411C       6

--Ted




                     Post this story to del.icio.us
               Post this story to Digg
    Post this story to Slashdot


Sponsored By
PRODATA COMPUTER SERVICES

Push-Pull-Synchronize Data TODAY!

Finally, a product that provides easy and full SQL access to remote databases
from all System i high-level languages. Remote Database Connect gives you
easy access to remote databases from your System i programs.

Share real time data across platforms NOW!

Use RDB Connect today.....
download a free trial NOW.

Order today and SAVE $$$!
800.228.6318

sales@prodatacomputer.com
www.prodatacomputer.com


Senior Technical Editor: Ted Holt
Technical Editor: Joe Hertvik
Contributing Technical Editors: Edwin Earley, Brian Kelly, Michael Sansoterra
Publisher and Advertising Director: Jenny Thomas
Advertising Sales Representative: Kim Reed
Contact the Editors: To contact anyone on the IT Jungle Team
Go to our contacts page and send us a message.

Sponsored Links

ARCAD Software:  Register now for May 21 Practical Test Automation Webinar
LANSA:  It's Time for 4 days of education at the LANSA User Conference, May 4 – 7, in Orlando
Vision Solutions:  A Rewind Button for i5 Data? Read the Whitepaper


 

IT Jungle Store Top Book Picks

Easy Steps to Internet Programming for AS/400, iSeries, and System i: List Price, $49.95
Getting Started with PHP for i5/OS: List Price, $59.95
The System i RPG & RPG IV Tutorial and Lab Exercises: List Price, $59.95
The System i Pocket RPG & RPG IV Guide: List Price, $69.95
The iSeries Pocket Database Guide: List Price, $59.00
The iSeries Pocket Developers' Guide: List Price, $59.00
The iSeries Pocket SQL Guide: List Price, $59.00
The iSeries Pocket Query Guide: List Price, $49.00
The iSeries Pocket WebFacing Primer: List Price, $39.00
Migrating to WebSphere Express for iSeries: List Price, $49.00
iSeries Express Web Implementer's Guide: List Price, $59.00
Getting Started with WebSphere Development Studio for iSeries: List Price, $79.95
Getting Started With WebSphere Development Studio Client for iSeries: List Price, $89.00
Getting Started with WebSphere Express for iSeries: List Price, $49.00
WebFacing Application Design and Development Guide: List Price, $55.00
Can the AS/400 Survive IBM?: List Price, $49.00
The All-Everything Machine: List Price, $29.95
Chip Wars: List Price, $29.95


 
The Four Hundred
IBM's Power Systems Sales Plan and Various Gotchas

Power Systems Performance: First Up, SAP BI Data Mart

PowerVM: The i Hypervisor Is Not Hidden Anymore

As I See It: That Competitive Bug

IBM Chases HP and Sun Unix Shops with Power Rewards

The Linux Beacon
Cray and Intel Hook Up for Future Supercomputers

Red Hat Previews Fedora 9 Development Linux

Intel Profits Hit, AMD Books a Loss in Recent Quarters

As I See It: Goldilocks and the Zen of IT

Sun and Wind River Partner for Linux on Sparc T2 Chips

Four Hundred Stuff
Vision Moves Product and Business Plans Forward

CYBRA Goes for i's Funny Bone with 2K, the 2,000 Year Old Programmer

Virtual Server Sprawl Reeled In with Tideway Foundation 7.1

Aldon's Lifecycle Management Suite Ready for RDi

Varsity Debuts Preconfigured Shipping Software for JDE World

Big Iron
IBM's Q1 Driven by Mainframes, Unix, Services, and the Weak Dollar

Top Mainframe Stories From Around the Web

Chats, Webinars, Seminars, Shows, and Other Happenings

System i PTF Guide
April 26, 2008: Volume 10, Number 17

April 19, 2008: Volume 10, Number 16

April 12, 2008: Volume 10, Number 15

April 5, 2008: Volume 10, Number 14

March 29, 2008: Volume 10, Number 13

March 22, 2008: Volume 10, Number 12

The Windows Observer
Dynamics CRM Online Is Now Online

Decline In Vulnerabilities Belies Threat Increase, Microsoft Says in New Security Report

Ballmer Downplays Yahoo's Financial Results

Intel Profits Hit, AMD Books a Loss in Recent Quarters

Server Makers Start Shipping Barcelona Boxes

The Unix Guardian
IBM Chases HP and Sun Unix Shops with Power Returns

Intel Profits Hit, AMD Books a Loss in Recent Quarters

IBM's Q1 Driven by Mainframes, Unix, Services, and the Weak Dollar

The X Factor: Everybody Wants Citrix Systems?

IBM Expands VIP to All Systems for Precision Sales

Four Hundred Monitor
Four Hundred Monitor's
Full iSeries Events Calendar

THIS ISSUE SPONSORED BY:

ProData Computer Services
WorksRight Software
Guild Companies


Printer Friendly Version


TABLE OF CONTENTS
Multiformat SQL Data Sets

Build Pivot Tables over DB2 Data

Solve a Client Access Mystery, Win a No Prize

Four Hundred Guru

BACK ISSUES

From the IT Jungle Forums
Java Messages

Restrict *cmd to specific user

Copying recs from a subfile to a file and keeping highlights

Imbedded SQL

CPYFRMSTMF problem

CPYTOIMPF problem





 
Subscription Information:
You can unsubscribe, change your email address, or sign up for any of IT Jungle's free e-newsletters through our Web site at http://www.itjungle.com/sub/subscribe.html.

Copyright © 1996-2008 Guild Companies, Inc. All Rights Reserved.
Guild Companies, Inc., 50 Park Terrace East, Suite 8F, New York, NY 10034

Privacy Statement