2012-01-12 4 views
0

Я не уверен, почему это так. Мне нужно выбрать несколько значений из двух таблиц на основе некоторых критериев, которые должны быть ясны из запроса, который я попробовал ниже.Выберите из двух таблиц, содержащих больше строк, чем ожидалось

query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n, Acknowledgment AS a 
      WHERE [email protected] AND n.id IN (SELECT parent_id FROM Acknowledgment 
              WHERE [email protected] AND [email protected])"; 

Это возвращает больше строк (12), чем ожидалось.

У меня есть две таблицы Уведомление и Подтверждение, которые имеют поле «сумма». Когда я пытаюсь выполнить запрос ниже, он дает правильные 3 строки, как ожидалось.

@"SELECT n.borrower, n.sum, n.lender FROM Notification AS n 
    WHERE [email protected] AND n.id IN (SELECT parent_id FROM Acknowledgment 
            WHERE [email protected] AND [email protected])"; 

Теперь мне нужно продлить этот запрос так, что мне нужно a.sum и не n.sum. Но когда я пытаюсь выполнить первый запрос, он дает намного больше строк, я имею в виду, что условие WHERE не работает. Я не знаю, если это причуда с MS Access или что-то не так с запросом. Я ценю альтернативную реализацию в доступе, если мой запрос кажется прекрасным, потому что он просто не работает! :)

Я прочитал here, что различные базы данных реализуют выбор по-разному. Незнайка, если его что-то конкретное с доступом ..

После предложения от Li0liQ, я попытался это:

@"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
    INNER JOIN Acknowledgment AS a ON a.parent_id = n.id AND [email protected] AND [email protected] 
    WHERE [email protected]" 

Но теперь я получаю «JOIN выражение не поддерживается» ошибку.

ответ

2

Это ожидаемое поведение, так как декартова продукта:

FROM Notification AS n, Acknowledgment AS a 

Если у вас есть 10 уведомлений и 5 подтверждения, вы получите 50 строк в результате, представляющие все возможные комбинации уведомления и подтверждения , Затем этот набор фильтруется с помощью предложения WHERE. (Это стандарт SQL, не специфичны для MS Access.)

Это звучит, как вам нужно JOIN:

FROM Notification AS n INNER JOIN Acknowledgement AS a ON n.id = a.parent_id 

Вы можете избавиться от подзапроса:

WHERE [email protected] AND [email protected] AND [email protected] 

EDIT

В соответствии с запросом nawfal, вот решение, к которому он пришел, который по существу включает вышеупомянутый reco mmendations:

string query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
      INNER JOIN Acknowledgment AS a ON a.parent_id=n.id 
      WHERE [email protected] AND [email protected] AND [email protected]"; 
+0

Просто отлично. Что-то близко к тому, о чем я думал! – nawfal

+0

Подзапрос не требуется. Это условие должно быть выполнено! – nawfal

+1

@nawfal, но добиться такого же результата можно, поставив эти условия в предложение WHERE, которое было бы более эффективным, чем вспомогательный запрос. – phoog

1

В первом запросе вы, кажется, пытается выполнить JOIN.
Однако вы заканчиваете выполнение CROSS JOIN, то есть вы запрашиваете все возможные комбинации из обеих таблиц (я уверен, у вас есть 4 строки в таблице Acknowledgment).

Я надеюсь, что следующий запрос может сделать трюк или, по крайней мере, поможет вам думать в правильном направлении:

SELECT 
    n.borrower, a.sum, n.lender 
FROM 
    Notification AS n 
INNER JOIN 
    Acknowledgment AS a 
ON 
    a.parent_id = n.id 
WHERE 
    [email protected] AND [email protected] AND [email protected] 
+0

Это, кажется, идеальный ответ. Вернитесь к вам, ребята, после некоторого тестирования :) – nawfal

+0

Когда я запускаю этот запрос, я получаю сообщение «JOIN», не поддерживающее сообщение об ошибке из Access! Но я помню, что успешно сделал LEFT OUTER JOIN успешно с доступом – nawfal

+0

@nawfal Соединение не поддерживается, потому что вы не можете использовать 'AND [email protected] AND a.deleted = @ del1' в предложении' JOIN'. Объединяющие выражения должны связывать столбцы с одной стороны соединения на другой стороне соединения. Эти выражения используют только столбцы из a. Они могут быть включены в предложение WHERE. – phoog

0

Что-то, кажется, неправильно с доступом, что я мог бы получить эту работу только путем восстановления запроса предоставленные ответчиками здесь следующим образом:

string query = SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
       INNER JOIN Acknowledgment AS a ON a.parent_id=n.id 
       WHERE [email protected] AND [email protected] AND [email protected]; 
+1

Это функционально эквивалентно запросу, на которое ссылается мой ответ. Почему вы думаете, что что-то не так с Access? – phoog

+0

@phoog Да функционально. Я думал, что запрос, который я обновил в вопросе, будет отлично работать с MySQL (к которому я больше привык), а не в Access. Это было мое чувство кишки после того, как немного поработали с MySQL и Access. Я никогда не сталкивался с проблемами в MySQL с операторами JOIN. Я могу понять, неправильно ли я получил синтаксис инструкции JOIN, но здесь Access просто говорит, что выражение JOIN не поддерживается. Я мог бы заставить его работать после прочтения большего количества из интернета. – nawfal

+0

Позвольте мне заявить еще одну причуду из MS Access. Если im передает значения, которые нужно обновить с помощью параметров и заполнителей, мне нужно, чтобы $ %%^передал его в ТОЧНОМ ТОЧНОМ ТОЧНОМ заказе, запрос читает эти значения. Это становится настолько огромной задачей, когда у вас есть сложные запросы. все время просматривают запрос и выясняют, какой запрос сначала выполняется, порядок и т. д. MySQL (я считаю, что другие мощные базы данных, такие как DB2 и т. д.) не имеют этой проблемы. Еще один, Access не поддерживает многие ключевые слова с надписью, которые я могу использовать в других базах данных. Все это заставило меня подумать, что это предмет доступа – nawfal

Смежные вопросы