繁体   English   中英

基于多个条件的SQL查询

[英]SQL query based on multiple criteria

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

SELECT * FROM orders ord1, orders ord2, conditions con 
WHERE ord1.trans = ord2.trans 
AND ord1.item = con.Product1 AND ord2.item = con.Product2

我认为这是第一个表INCOMPAT和第二个表ORDERS的解决方案名称。 下面的查询将为您提供结果,但是在您的实际数据库中,您可能需要进行一些更改:

select o1.item + '@' + o2.item
from orders o1 full join  orders o2 on o1.orderid = o2.orderid
where exists (select * from incompat i where o1.item + '@' + o2.item = i.col1 + '@' + i.col2)

简单,只需使用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

您可以通过按其ID加入交易来列出交易中所有可能的对。 然后检查是否有任何一对违反规则

select distinct a.id
from transactions a
join transactions b on a.id = b.id and a.line_num <> b.line_num
join inappropriates c on a.item = c.col1 and b.item = c.col2;

这是选择查询:

-创建表和插入值的代码

Create Table InvalidCombos(item1 int, item2 int)

Create Table TransactionInfo(transactionId int, item int)

Insert Into InvalidCombos Values(1,2), (1,8), (1,4), (2,6), (2,26), (3,26), (3,4), (3,2)

Insert Into TransactionInfo Values(12345,1), (12345,2), (45678,26), (45678,6)

-这是带有结果的select语句:

Select ic.item1, ic.item2, transinfo.transactionId From invalidcombos ic 
  INNER JOIN ( 
    Select ti1.transactionId, ti1.item as item1, ti2.item as item2 
      From TransactionInfo ti1 
      LEFT JOIN TransactionInfo ti2 ON ti1.transactionid = ti2.transactionid 
      and ti1.item <> ti2.item
    )
    transinfo ON (transinfo.item1 = ic.item1 AND transinfo.item2 = ic.item2)

在表2上使用自完全联接如何获得每个顺序的所有组合。 然后只需将其内部联接到表1。

select * into #t1 from
(
    select 'a' as col1, 'b' as col2
    union
    select 'a' as col1, 'h' as col2
    union
    select 'a' as col1, 'd' as col2
) q


select * into #t2 from
(
select 1 as trans, 1 as line, 'a' as item
union
select 1 as trans, 2 as line, 'b' as item
union
select 1 as trans, 3 as line, 'a' as item
union
select 2 as trans, 1 as line, 'z' as item
union
select 2 as trans, 2 as line, 'f' as item
) q

select o.* from #t1 as v
inner join
(
    select distinct a.trans, a.item as item1, b.item as item2
    from #t2 as a
    full join #t2 as b on a.trans = b.trans and a.line <> b.line
) as o on v.col1 = o.item1 and v.col2 = o.item2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM