• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • Multiformat SQL Data Sets

    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

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    ARCAD Software

    [Live Webinar] Rewrite your Synon in Java? It could be… a mistake!

    Converting from Synon CA 2E to a modern language? There are many good reasons to take this step. Beyond the critical shortage of Synon skills, applications developed in this 4GL environment can no longer take advantage of key technology advances in the IBM i operating system. And though a leader in its day, the Synon CASE tool is incompatible with modern DevOps practices and concurrent development.

    Do you think the best way to move away from Synon CA 2E is by rewriting everything in Java?

    Think again. A full rewrite is risky, expensive, and slow — often leading to years of redevelopment and countless functional regressions.

    Join Philippe Magne, CEO of ARCAD Software and Ray Bernardi, senior solution architect to learn why a conversion to Free Form RPG is a risk-free and high-performance option that leverages the architecture of the original Synon application – retaining all the reliability and security advantages of the host platform.

    In our Webinar, we will share a secure, automated migration path for business applications developed in Synon CA 2E:

    • 100% automated conversion to modern Free Form RPG and DDL (SQL)
    • Guaranteed conversion accuracy with test automation process
    • Possible modernization of the user interface during the project
    • Risk free, fixed price Modernization as a Service (MaaS)
    • Modern full DevOps framework for delivery

    Leverage the competitive advantage within your Synon application.

    Register Today!

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    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

    Decline In Vulnerabilities Belies Threat Increase, Microsoft Says in New Security Report IBM Previews “Blue Business” SMB System Sales Approach

    Leave a Reply Cancel reply

Volume 8, Number 17 -- April 30, 2008
THIS ISSUE SPONSORED BY:

ProData Computer Services
WorksRight Software
Guild Companies

Table of Contents

  • Multiformat SQL Data Sets
  • Build Pivot Tables over DB2 Data
  • Solve a Client Access Mystery, Win a No Prize

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • Bang For The Buck On Entry Power10 And Power11 Machines
  • A Hardware Refresh Is The Perfect Time To Re-Evaluate Your HA/DR Strategy
  • Fresche Taps AI For New RPG-To-Java Conversion Tool
  • Gartner Raises 2025 IT Spending Forecast, Puts Out 2026 Prediction
  • IBM i PTF Guide, Volume 27, Number 45
  • EvolveWare Makes Progress With RPG Code Modernization Using AI
  • Why The IBM i Market Needed Another VTL Option
  • What Price Power?
  • Cloud Revenues Saved By The GenAI Boom
  • IBM i PTF Guide, Volume 27, Number 44

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle