I need to fully review the contents of your questionnaire and data column, then might get some nice idea. In other words, information here is bit far too less to deliver some advice.
Roughly to say i thought this, if you are not able to change the table structure (now understand you cant change)
Generate full list of the product as LIST, for instance, to generate the virtual column using select expression OR simply hard code like LIST(Product - 1, Product -2, Product -3…Product 20) - Let s name this vc as [FullList]
Then for each fields set the type to Enum, and add this expression into the valid if constrain.
for the first column, just [FullList] this returns entire list out of virtual column
for the second column add valid if constrain like [FullList] - [First Column] this should return the list expect for the item being selected in the first column.
for the third column, then [FullList] - [First Column] - [Second Column]
Then for the reminder of the column, keep adding, actually keep add minus the previous column which would reduce the number of the list dynamically.
Again, i m sorry not doing hands on test, but technically it should work.