簡體   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