2017-11-03 27 views
0

如何获取连接子查询为空的行?获取左连接子查询为空(未找到)的行

SELECT * 
FROM bank_recon b 
LEFT JOIN (
    SELECT o.bank_recon_id 
    FROM data_voucher_ocr_bank o 
    LEFT JOIN data_voucher v ON v.id=o.data_voucher_id 
    WHERE v.is_ocr_verified=1 
    LIMIT 1 
) s ON s.bank_recon_id=b.id 
WHERE s IS NULL 

更新

当使用此查询(子查询)的东西被取出取决于如果is_ocr_verified设置或不

SELECT o.bank_recon_id 
FROM data_voucher_ocr_bank o 
LEFT JOIN data_voucher v ON v.id=o.data_voucher_id 
WHERE v.is_ocr_verified=1 && o.bank_recon_id=320062 

当使用此查询一切都是牵强不管是什么!?

SELECT b.txt, b.amount 
FROM bank_recon b 
LEFT JOIN (
    SELECT o.bank_recon_id 
    FROM data_voucher_ocr_bank o 
    LEFT JOIN data_voucher v ON v.id=o.data_voucher_id 
    WHERE v.is_ocr_verified=1 
    LIMIT 1 
) s ON s.bank_recon_id=b.id 
WHERE b.id=320062 && s.bank_recon_id IS NULL 
+0

你需要在一列没有交付表别名WHERE过滤器。 –

+0

为什么要使用反连接?我只是使用“NOT EXISTS”或“NOT IN”。这些更可读。你的子查询中的'LEFT JOIN'应该是'INNER JOIN'(你的'WHERE'子句甚至会隐式地将它变成一个内连接)。 –

+0

@thorsten kettner你能举个例子吗? – clarkk

回答

2

在您的WHERE子句中指定一列,而不仅仅是子查询。

WHERE s.bank_recon_id IS NULL 
+0

已经尝试过,但无论是否找到子查询,它都会提取所有行 – clarkk

+0

@clarkk:因为这不是您的查询中唯一的问题。你的子查询选择一行。因此,您只会解散与此行匹配的一个bank_recon记录。你必须删除'LIMIT'子句。 –

0

防连接(这是你正试图在这里适用的)是,当直线前进NOT INNOT EXISTS具有在DBMS中的性能问题,我们使用的方法。

提供data_voucher_ocr_bank.bank_recon_id不能为空,我们可以使用:

SELECT txt, amount 
FROM bank_recon 
WHERE id NOT IN 
(
    SELECT bank_recon_id 
    FROM data_voucher_ocr_bank 
    WHERE data_voucher_id IN (SELECT id FROM data_voucher WHERE is_ocr_verified = 1) 
); 

(否则,我们想补充AND bank_recon_id IS NOT NULL或使用NOT EXISTS代替。)