如何获取连接子查询为空的行?
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 :(得分:2)
在WHERE
子句中指定一个列,而不仅仅是子查询。
WHERE s.bank_recon_id IS NULL
答案 1 :(得分:0)
反连接(这是您尝试在此处应用的)是我们在直接NOT IN
或NOT 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
。)