基本上我有2张桌子。 1个表有两个(重要)列的列表。一般的想法是第2列中的项目不能与第1列中的项目一起出售。它本质上是一组规则,用于确定正确的结算组合。该表看起来类似于:
col 1 ; col 2
----- -----
a ---- b
a ---- h
a ---- d
b ---- f
b ---- z
c ---- z
c ---- d
c ---- b
第1列中的项目不能与第2列中的项目一起销售。
第二个表基本上是一个"命令"表。每笔交易都有交易号和行号。在每个交易行上都有卖出的商品。每笔交易通常会出售许多项目。该表的设置与此类似:
trans # ; trans line ; item
------- ----------- -----
12345 ---- 1 ---- a
12345 ---- 2 ---- b
12345 ---- 3 ---- a
45678 ---- 1 ---- z
45678 ---- 2 ---- f
我要做的是获取所有交易数据,并将其与不适当项目组合列表中的数据进行协调。正如您所看到的,交易12345违反了第一条规则,因为' a'与'出售。这是一般的想法。
答案 0 :(得分:1)
SELECT * FROM orders ord1, orders ord2, conditions con
WHERE ord1.trans = ord2.trans
AND ord1.item = con.Product1 AND ord2.item = con.Product2
答案 1 :(得分:0)
简单,只需使用EXISTS子句。
SELECT
COUNT(*)
FROM
Trans AS Trans1
JOIN Trans AS Trans2 ON
Trans1.transNb = Trans2.transNb
WHERE CONCAT(Trans1.item, '|', Trans2.item) IN
(SELECT CONCAT(item1, '|', item2) FROM xCombination)
如果COUNT不是0,那么订单中的组合无效。
基本上我们使用Trans1和Trans2以相同顺序制作所有项目的笛卡尔积。然后,我们将一个字符串中的两个项目的每个组合与一个分隔符连接起来。如果可以在xCombination表中找到一个字符串,那么该顺序就会出错。
这是SQL Fiddle。