基于多个条件的SQL查询

时间:2014-06-14 00:00:34

标签: mysql sql sql-server sql-server-2008 tsql

基本上我有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'与'出售。这是一般的想法。

2 个答案:

答案 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