关于INNER JOIN的正确使用

本文关键字:INNER JOIN 关于 | 更新日期: 2023-09-27 18:06:21

我一直有问题,试图从我的数据库检索数据到Microsoft Visual c#中的数据表。有人告诉我,这是因为INNER join使用不当。查询(Fill方法)是后面的查询。

SELECT Bordero.id AS id, Titulo.id AS id_titulo, Titulo.valor AS valor_titulo, 
       Sacado.nome AS nome_sacado, Cliente.nome AS nome_cliente, Sacado.documento,
       Titulo.taxa_adm AS taxa_adm_titulo, Titulo.desagio AS desagio_titulo, 
       Titulo.liquido AS liquido_titulo, 
       (CASE Titulo.tipo 
             WHEN 'True' THEN 'Cheque' 
             ELSE 'Duplicata' 
        END) AS tipo, Titulo.dias, Titulo.codigo, Titulo.vencimento, 
       Titulo.data_base, Bordero.desagio AS desagio_bordero, 
       Bordero.taxa_adm AS taxa_adm_bordero, Bordero.liquido AS liquido_bordero, 
       Bordero.bruto, Bordero.duplicata, Bordero.desconto, Bordero.iss, Bordero.iof,
       Bordero.cpmf, Bordero.pis, Bordero.cofins, Desconto.valor AS valor_desconto,
       Desconto.descricao, Bordero.id_cliente
FROM   Bordero 
INNER JOIN Cliente ON Bordero.id_cliente = Cliente.id
INNER JOIN Titulo ON Bordero.id = Titulo.bordero_id
INNER JOIN Sacado ON Sacado.id = Titulo.sacado_id
INNER JOIN Desconto ON Cliente.id = Desconto.id_cliente

数据库图是这样的:http://i53.tinypic.com/t0g4qp.jpg

有什么提示吗?

关于INNER JOIN的正确使用

没有说明你的问题是什么,你正在经历我的猜测,你可能需要使用LEFT OUTER JOIN的一些表,而不是所有的INNER JOIN

当在查询中使用INNER JOIN时,您通过ON子句匹配的数据必须在两个表中都不为空。这意味着如果ID存在于左表(FROM子句中的ID)中,那么在右表中必须有匹配的记录(通过INNER JOIN加入的记录)。如果正确的表没有匹配的记录,则从查询中删除整个结果。

通过使用LEFT OUTER JOIN代替,您允许正确的表返回NULL而不是每个不匹配的数据行。

TABLE A       TABLE B
ID  |  Name   ID  | Address
1   |  Alice  1   | 123 ABC St.
2   |  Bob    3   | 789 XYZ St.  
3   |  Cam

使用上面的表,如果要执行FROM A INNER JOIN B ON A.ID = B.ID操作,只会返回第1行和第3行。如果您要执行FROM A LEFT OUTER JOIN B ON A.ID = B.ID,则将返回A中的所有行,并且B.Address将为null。