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

时间:2017-11-03 22:24:32

标签: mysql

如何获取连接子查询为空的行?

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

2 个答案:

答案 0 :(得分:2)

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

WHERE s.bank_recon_id IS NULL

答案 1 :(得分: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。)