# Unifying small and great divide

Quote from tobega on February 14, 2021, 8:18 pmLooking at the small and great divide in DTATRM with the modification on page 181 to switch the per and the operands, I believe that they can be unified to one operation.

- Small divide to find the suppliers that supply all purple parts:
WITH ( P WHERE COLOR = COLOR('Purple') )AS PP:

SP { S#, P# } DIVIDEBY PP { P# } PER ( S { S# } )

which can be implemented as

WITH ( P WHERE COLOR = COLOR('Purple') )AS PP,

( S { S# } JOIN PP { P# } )AS QQ,

( QQ MINUS SP { S#, P# } )AS RR: //(a)

S { S# } MINUS RR { S# }

2. Great divide to find the suppliers that supply all red parts for a project

WITH ( PJ JOIN ( P WHERE COLOR = COLOR('Red') ) AS RPJ:

SP { S#, P# } DIVIDEBY RPJ { P#, J# } PER ( S { S# } , J { J# } )

which can be implemented as:

( S { S# } JOIN J { J# } )MINUS ( ( S { S# } JOIN RPJ { P#, J# } )MINUS ( SP { S#, P# }JOIN RPJ { P#, J# } ) ) { S#, J# }

which can be rewritten as:

WITH ( S { S# } JOIN J { J# } ) AS SJ,

( S { S# } JOIN RPJ { P#, J# } ) AS QQ, //(b)

(QQ MINUS ( SP { S#, P# }JOIN RPJ { P#, J# } )) AS RR,

SJ {S#, J#} MINUS RR{S#, J#}

Now I observe that in the small divide:

( QQ MINUS SP { S#, P# } )AS RR: //(a)

can just as well be written:

( QQ MINUS (SP { S#, P# } JOIN PP{P#} )AS RR: //(a)

and in the great divide

( S { S# } JOIN RPJ { P#, J# } ) AS QQ, //(b)

can just as well be written:

( SJ { S#, J# } JOIN RPJ { P#, J# } ) AS QQ, //(b)

So, we have it complete that

A DIVIDEBY B PER C

is implemented as

WITH ( C JOIN B ) AS QQ,

( QQ MINUS (A JOIN B) )AS RR:

C MINUS RR

Where for the small divide example A = SP, B=PP and C=S

and for the great divide example A = SP, B=RPJ and C=SJ

Is that correct?

Looking at the small and great divide in DTATRM with the modification on page 181 to switch the per and the operands, I believe that they can be unified to one operation.

- Small divide to find the suppliers that supply all purple parts:

WITH ( P WHERE COLOR = COLOR('Purple') )AS PP:

SP { S#, P# } DIVIDEBY PP { P# } PER ( S { S# } )

which can be implemented as

WITH ( P WHERE COLOR = COLOR('Purple') )AS PP,

( S { S# } JOIN PP { P# } )AS QQ,

( QQ MINUS SP { S#, P# } )AS RR: //(a)

S { S# } MINUS RR { S# }

2. Great divide to find the suppliers that supply all red parts for a project

WITH ( PJ JOIN ( P WHERE COLOR = COLOR('Red') ) AS RPJ:

SP { S#, P# } DIVIDEBY RPJ { P#, J# } PER ( S { S# } , J { J# } )

which can be implemented as:

( S { S# } JOIN J { J# } )MINUS ( ( S { S# } JOIN RPJ { P#, J# } )MINUS ( SP { S#, P# }JOIN RPJ { P#, J# } ) ) { S#, J# }

which can be rewritten as:

WITH ( S { S# } JOIN J { J# } ) AS SJ,

( S { S# } JOIN RPJ { P#, J# } ) AS QQ, //(b)

(QQ MINUS ( SP { S#, P# }JOIN RPJ { P#, J# } )) AS RR,

SJ {S#, J#} MINUS RR{S#, J#}

Now I observe that in the small divide:

( QQ MINUS SP { S#, P# } )AS RR: //(a)

can just as well be written:

( QQ MINUS (SP { S#, P# } JOIN PP{P#} )AS RR: //(a)

and in the great divide

( S { S# } JOIN RPJ { P#, J# } ) AS QQ, //(b)

can just as well be written:

( SJ { S#, J# } JOIN RPJ { P#, J# } ) AS QQ, //(b)

So, we have it complete that

A DIVIDEBY B PER C

is implemented as

WITH ( C JOIN B ) AS QQ,

( QQ MINUS (A JOIN B) )AS RR:

C MINUS RR

Where for the small divide example A = SP, B=PP and C=S

and for the great divide example A = SP, B=RPJ and C=SJ

Is that correct?