Search code examples
sqloracle-databasemicrosoft-query

Oracle SQL Join two tables/views avoid cross product


I have two tables/views that I am trying to join properly. They are V_ARINVOICE_ALL and V_GLBATCH_AR_COGS. The third table V_ARINVOICE_ALL in the following image is just for extra explanation.

Click Here

I'm currently getting the wrong amount of rows being returned because of, I think, kind of a cross join. I am trying to join Credit from V_GLBATCH_AR_COGS.

I use the following SQL query to join V_ARINVOICE_ALL and V_ARINVOICE_ALL and I get the all the right results except for the `Credit which isn't selected:

SELECT 
V_ARINVOICE_ALL.INVOICE_DATE,
V_ARINVOICE_ALL.ARCUSTO_COMPANY,
V_ARINVOICE_ALL.ARCUSTO_CUSTNO,
V_ARINVOICE_ALL.INVOICE_NO


FROM   
IQMS.V_ARINVOICE_ALL V_ARINVOICE_ALL 


INNER JOIN
IQMS.V_GLACCT V_GLACCT
ON
  V_ARINVOICE_ALL.GLACCT_ID_SALES = V_GLACCT.ID AND V_GLACCT.ACCT = '3648-00-0'



WHERE 
V_ARINVOICE_ALL.ARCUSTO_CUSTNO = 'OX01' 
AND 
V_ARINVOICE_ALL.INVOICE_DATE >= TO_DATE('05/04/2016', 'dd/mm/yyyy')
AND
V_ARINVOICE_ALL.INVOICE_DATE <= TO_DATE('15/06/2017', 'dd/mm/yyyy')

ORDER BY 
 V_ARINVOICE_ALL.INVOICE_DATE 

Result (41 Rows)

  |INVOICE_DATE|...| INVOICE|
  +------------+---+--------+
  |  05/04/2016|...|  494658|
  |  20/05/2016|...|  495274|
  |  20/05/2016|...|  495275|

But when I try and join V_ARINVOICE_ALL and V_GLBATCH_AR_COGS with the following query:

SELECT 
 V_ARINVOICE_ALL.INVOICE_DATE,
 V_ARINVOICE_ALL.ARCUSTO_COMPANY,
 V_ARINVOICE_ALL.ARCUSTO_CUSTNO,
 V_ARINVOICE_ALL.INVOICE_NO,
 V_GLBATCH_AR_COGS.CREDIT AS "INCOME"


FROM   
 IQMS.V_ARINVOICE_ALL V_ARINVOICE_ALL 


INNER JOIN
 IQMS.V_GLBATCH_AR_COGS V_GLBATCH_AR_COGS
ON
 V_ARINVOICE_ALL.GLBATCHID_ID = V_GLBATCH_AR_COGS.ID
 AND V_ARINVOICE_ALL.GLPERIODS_ID_AR = V_GLBATCH_AR_COGS.GLPERIODS_ID
 AND V_GLBATCH_AR_COGS.DESCRIP LIKE '%OX01%ITEMS%' AND V_GLBATCH_AR_COGS.ACCT = '3648-00-0'



WHERE 
 V_ARINVOICE_ALL.ARCUSTO_CUSTNO = 'OX01' 
AND 
 V_ARINVOICE_ALL.INVOICE_DATE >= TO_DATE('05/04/2016', 'dd/mm/yyyy')
AND
 V_ARINVOICE_ALL.INVOICE_DATE <= TO_DATE('15/06/2017', 'dd/mm/yyyy')

ORDER BY 
 V_ARINVOICE_ALL.INVOICE_DATE 

I get something like: (165 Rows)

  |INVOICE_DATE|...| INVOICE|  INCOME|
  +------------+---+--------+--------+
  |  ...       |...|  ...   |   ...  |
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     450|
  |  23/06/2016|...|  495667|     450|
  |  23/06/2016|...|  495667|     450|
  |  ...       |...|  ...   |   ...  |

Desired result (41 Rows)

  |INVOICE_DATE|...| INVOICE|  INCOME|
  +------------+---+--------+--------+
  |  ...       |...|  ...   |   ...  |
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     450|
  |  ...       |...|  ...   |   ...  |

I'm a bit more familiar with joins than I was before. But I'm not certain I'm doing them right. I've tried right join, right outer join, left join, left outer join, etc. What am I doing wrong here?


EDIT2: First edit was bad made no sense. I don't know if this helps but there is only two rows that would be

  |  23/06/2016|...|  495667|     225|
  |  23/06/2016|...|  495667|     225|

in the table which match the WHERE clause on the Join : V_ARINVOICE_ALL.GLPERIODS_ID_AR = V_GLBATCH_AR_COGS.GLPERIODS_ID AND V_GLBATCH_AR_COGS.DESCRIP LIKE '%OX01%ITEMS%' AND V_GLBATCH_AR_COGS.ACCT = '3648-00-0

But would still get it more than twice. So I imagine it has something to do with the relationship being 1 to Many. Which I'm not sure how to deal with.

If that's any help.


If you need more info feel free to ask.


Solution

  • Looks like a one to many relationship. There are more values in the COGS table than you require (likely another column filled with other data).

    Try SELECT DISTINCT to limit to unique values on selected columns:

    SELECT DISTINCT -- DISTINCT goes here
     V_ARINVOICE_ALL.INVOICE_DATE,
     V_ARINVOICE_ALL.ARCUSTO_COMPANY,
     V_ARINVOICE_ALL.ARCUSTO_CUSTNO,
     V_ARINVOICE_ALL.INVOICE_NO,
     V_GLBATCH_AR_COGS.CREDIT AS "INCOME"
    
    
    FROM   
     IQMS.V_ARINVOICE_ALL V_ARINVOICE_ALL 
    
    
    INNER JOIN
     IQMS.V_GLBATCH_AR_COGS V_GLBATCH_AR_COGS
    ON
     V_ARINVOICE_ALL.GLBATCHID_ID = V_GLBATCH_AR_COGS.ID
     AND V_ARINVOICE_ALL.GLPERIODS_ID_AR = V_GLBATCH_AR_COGS.GLPERIODS_ID
     AND V_GLBATCH_AR_COGS.DESCRIP LIKE '%OX01%ITEMS%' AND V_GLBATCH_AR_COGS.ACCT = '3648-00-0'
    
    
    
    WHERE 
     V_ARINVOICE_ALL.ARCUSTO_CUSTNO = 'OX01' 
    AND 
     V_ARINVOICE_ALL.INVOICE_DATE >= TO_DATE('05/04/2016', 'dd/mm/yyyy')
    AND
     V_ARINVOICE_ALL.INVOICE_DATE <= TO_DATE('15/06/2017', 'dd/mm/yyyy')
    
    ORDER BY 
     V_ARINVOICE_ALL.INVOICE_DATE