关于正确使用INNER JOIN

时间:2011-08-22 02:49:16

标签: c# sql sql-server database visual-studio

我在尝试将数据从数据库检索到Microsoft Visual C#中的DataTable时遇到了问题。我被告知这是因为INNER JOIN的使用不当。查询(填充方法)是随后的。

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

任何有关错误的提示?

1 个答案:

答案 0 :(得分:4)

如果您没有说明您的问题是什么,那么您可能需要使用LEFT OUTER JOIN来表示某些表格,而不是所有INNER JOIN

在查询中使用INNER JOIN时,通过ON子句匹配的数据必须在两个表中都不为空。这意味着如果左侧表(FROM子句中的ID)存在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中的所有行,而#{1}}将为#2。