Mysql查询左连接不在

时间:2013-04-17 18:25:33

标签: mysql join

对于给定的loanID, 如果那个loanID已经存在于table1中,但不存在于table2中,我想选择属于该loanID的所有项目名 如果那个loanID存在于两个表(table1和table2)和balanceDue> 0中,那么在这种情况下还需要选择属于该loanid的itemnames。

表1:

loanID, itemId, itemName, itemQty, balanceQty

表2:

loanID, itemId, GRN, itemName, balanceDue, qty

样本数据

案例1

表1

loanID  itemId     itemName    
LN1     IT1        Item001        
LN1     IT2        Item002        
LN1     IT3        Item003        
LN2     IT1        Item001        
LN2     IT2        Item002        
LN2     IT3        Item003        
LN3     IT1        Item001        
LN3     IT2        Item002        
LN3     IT3        Item003        

表2

loanID  itemId  itemName  balanceDue
LN1     IT1     Item001   0
LN1     IT2     Item002   0
LN1     IT3     Item003   0
LN2     IT1     Item001   0
LN2     IT2     Item002   0
LN2     IT3     Item003   1000

如果我选择LN3作为LoanID,因为LN3不在表2中,我需要让所有项目名都属于LN3 LN3的结果必须

item001, item002, item003

案例2

如果我在表2上存在LN3作为LoanID,如果任何项目的balanceDue> 0属于LN3 必须生产这些项目名称。

LN3的结果必须

item001, item003

如果我选择LN2作为loanID, LN2的结果必须是

item001

表1

loanID  itemId  itemName    
LN1 IT1 Item001        
LN1 IT2 Item002        
LN1 IT3 Item003        
LN2 IT1 Item001        
LN2 IT2 Item002        
LN2 IT3 Item003        
LN3 IT1 Item001        
LN3 IT2 Item002        
LN3 IT3 Item003        

表2

loanID  itemId  itemName    balanceDue
LN1 IT1 Item001        0
LN1 IT2 Item002        0
LN1 IT3 Item003        0
LN2 IT1 Item001        300
LN2 IT2 Item002        0
LN2 IT3 Item003        1000
LN3 IT1 Item001        500
LN3 IT2 Item002        0
LN3 IT3 Item003        0    

3 个答案:

答案 0 :(得分:2)

尝试

SELECT
  table1.loanID,
  GROUP_CONCAT( COALESCE( table2.itemName,table1.itemName ) )
FROM
  table1 
  LEFT JOIN table2 ON table1.loanID = table2.loanID
WHERE
  table2.loanID IS NULL OR balanceDue>0
GROUP BY
  table1.loanID

答案 1 :(得分:1)

SELECT
  table1.loanID,
  COALESCE(table2.itemName, table1.itemName)
FROM
  table1 LEFT JOIN table2 ON table1.loanID = table2.loanID
  AND balanceDue>0

请参阅小提琴here。如果表2中存在loanID,但没有balanceDue> 0的行,则返回table1.itemName。

修改

我想你可能需要这个查询:

SELECT
  table1.itemName
FROM
  table1 LEFT JOIN table2
  ON table1.loanID = table2.loanID
  AND table1.itemId = table2.itemId                   
WHERE
  table1.loanID='LN3' AND
  COALESCE(table2.balanceDue>0, TRUE)

或者这个:

SELECT DISTINCT
  COALESCE(table2.itemName, table1.itemName)
FROM
  table1 LEFT JOIN table2
  ON table1.loanID = table2.loanID                   
WHERE
  table1.loanID='LN3' AND
  COALESCE(table2.balanceDue>0, TRUE)

小提琴here

答案 2 :(得分:0)

SELECT T1.loanId, T1.itemName
FROM table1 AS T1
WHERE T1.loanId IN 
    (SELECT loanId FROM table2 WHERE loanId=T1.loadId AND balanceDue>0)
AND T1.loanId=?