Выберите из двух таблиц, давая больше строк, чем ожидалось - PullRequest
0 голосов
/ 12 января 2012

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

query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n, Acknowledgment AS a 
          WHERE n.deleted=@del2 AND n.id IN (SELECT parent_id FROM Acknowledgment
                                             WHERE status=@status AND deleted=@del1)";

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

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

@"SELECT n.borrower, n.sum, n.lender FROM Notification AS n 
  WHERE n.deleted=@del2 AND n.id IN (SELECT parent_id FROM Acknowledgment
                                     WHERE status=@status AND deleted=@del1)";

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

Я прочитал здесь , что различные базы данных осуществляют выбор по-разному. Не знаю, если это что-то конкретное с доступом ..

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

@"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
  INNER JOIN Acknowledgment AS a ON a.parent_id = n.id AND a.status=@status AND a.deleted=@deleted1 
  WHERE n.deleted=@deleted2"

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

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Это ожидаемое поведение из-за декартового произведения:

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 n.deleted=@del2 AND a.status=@status AND a.deleted=@del1

EDIT

В соответствии с просьбой nawfal, вот решение, к которому он пришел, в сущности включающее в себя приведенные выше рекомендации:

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 a.status=@status AND a.deleted=@deleted1 AND n.deleted=@deleted2"; 
1 голос
/ 12 января 2012

В первом запросе вы, похоже, пытаетесь выполнить 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
    n.deleted=@del2 AND a.status=@status AND a.deleted=@del1
0 голосов
/ 12 января 2012

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

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 a.status=@status AND a.deleted=@deleted1 AND n.deleted=@deleted2;
...