2011-08-22 49 views
1

我一直有问题试图从我的数据库检索数据到Microsoft Visual C#中的DataTable。我被告知这是因为INNER JOINs使用不当。查询(填充方法)如下。关于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

什么地方不对劲任何提示?

+3

你一直有什么问题?你没有得到你期望的数据,是否抛出异常,等等? – Tim

+0

有什么问题?就内部连接而言,这个查询没有任何问题。不知道你期望看到什么和/或错误是什么,很难想象这个问题在心理上 – deutschZuid

+0

问题是给定的查询没有返回任何数据。 –

回答

4

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

在查询中使用INNER JOIN时,通过ON子句必须匹配的数据在两个表中都不为空。这意味着如果左表(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对于#2将为空。

+0

完美工作。谢谢! –