О правильном использовании INNER JOIN - PullRequest
1 голос
/ 22 августа 2011

У меня были проблемы при попытке извлечь данные из моей базы данных в DataTable в Microsoft Visual C #.Мне сказали, что это из-за неправильного использования внутренних соединений.Запрос (метод 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

Любые подсказки, что не так?

1 Ответ

4 голосов
/ 22 августа 2011

Без объяснения, в чем заключается ваша проблема с тем, что вы испытываете, я думаю, вам может понадобиться использовать LEFT OUTER JOIN для некоторых таблиц вместо всех INNER JOIN.

При использовании INNER JOIN в запросе данные, которые вы сопоставляете с помощью предложения ON , должны быть ненулевыми в обеих таблицах. Это означает, что если идентификатор существует в левой таблице (той, которая указана в предложении 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...