【问题标题】:About the proper use of INNER JOIN关于正确使用INNER JOIN
【发布时间】:2011-08-22 02:49:15
【问题描述】:

我在尝试将数据从数据库检索到 Microsoft Visual C# 中的 DataTable 时遇到问题。我被告知这是因为 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

有什么提示吗?

【问题讨论】:

  • 您遇到了什么问题?你没有得到你期望的数据,是不是抛出异常等等?
  • 有什么问题?就内部连接而言,此查询没有任何问题。在不知道您期望看到什么和/或错误是什么的情况下,很难从心理上想象这个问题
  • 问题是给定的查询没有返回数据。

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


【解决方案1】:

没有说明您遇到的问题是什么,我的猜测是您可能需要对某些表使用LEFT OUTER JOIN,而不是所有INNER JOIN

在查询中使用INNER JOIN 时,您通过ON 子句匹配的数据必须在两个表中都不为空。这意味着如果 ID 存在于左表中(FROM 子句中的那个),则右表中必须有匹配的记录(您通过 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 将为空。

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-10-07
    • 2012-02-05
    • 2014-06-23
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多