Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Сиротские Master-записи

Delphi , Базы данных , SQL

Сиротские Master-записи

Автор: David G. Wachtel

Как с помощью SQL найти записи таблицы, которых нет в другой таблице?

Вот пример:


with PeopleHiddenForm.PersonQuery.SQL do begin
Add('Select P.Last, P.First, P.Middle, P."Suffix", P.KeyNo, COUNT(PersMemL.PersonKeyNo)');
Add('From   Person P Left Outer Join ');
Add('       PersMemL PersMemL');
Add('On     ((P.KeyNo = PersMemL.PersonKeyNo))');
Add('Group By P.Last, P.First, P.Middle, P.Suffix, P.KeyNo');
Add('Having ((Count(PersmemL.PersonKeyNo) = 0))');

Данный код позволяет связаться с таблицей (PersMemL), содержащей количество ключей персональной записи и запись членства. Запрос возвращает имена персон, которые не имеют записей членства.

На практике этот способ оказывается очень эффективным, по крайней мере, с локальным SQL в таблицах Paradox.

Here's the translation of the text into Russian:

Вечная проблема поиска записей в одной таблице, которые не существуют в другой!

Предлагаемый код-сниппет - это умелое решение с использованием LEFT OUTER JOIN и HAVING-clause для достижения этого. Давайте разбить его на части:

  1. Блок with PeopleHiddenForm. PersonQuery. SQL do begin определяет запрос SQL.
  2. Первая строка, Add('Select P. Last, P.First, P.Middle, P."Suffix", P.KeyNo, COUNT(PersMemL. PersonKeyNo)'), specifies the columns to select from the Person table (P) and includes a count of matching records in the PersMemL table.
  3. Вторая строка, Add('From Person P Left Outer Join PersMemL PersMemL'), performs a left outer join between the Person table (P) and the PersMemL table. This ensures that all rows from the Person table are included, even if there's no matching record in PersMemL.
  4. Третья строка, Add('On ((P.KeyNo = PersMemL. PersonKeyNo))'), specifies the join condition: the KeyNo column in both tables must match.
  5. Четвертая строка, Add('Group By P.Last, P.First, P.Middle, P.Suffix, P.KeyNo'), groups the results by the columns specified in the select statement.
  6. Финальная строка, Add('Having ((Count(PersMemL. PersonKeyNo) = 0))'), filters the results to only include records where the count of matching rows in PersMemL is zero, effectively returning persons who don't have any membership records.

Этот запрос действительно эффективен, особенно при работе с локальными базами данных SQL, такими как Paradox. Однако, стоит отметить, что это подход может не быть подходит для более крупных наборов данных или более сложных сценариев, так как он требует полного сканирования таблицы.

Альтернативное решение могло бы быть использованием EXCEPT-clause (если поддерживается базой данных), которое может быть более эффективно для больших наборов данных:

SELECT P.Last, P.First, P.Middle, P."Suffix", P.KeyNo
FROM Person P
EXCEPT
SELECT PersMemL. PersonKeyNo
FROM PersMemL;

Этот запрос возвращает записи из Person, которые не присутствуют в PersMemL. Однако, это подход не совместим с всеми базами данных и может требовать дополнительной обработки для случаев, когда несколько строк в Person соответствует одной строке в PersMemL.

В статье описан способ использования SQL для поиска записей таблицы, которых нет в другой таблице, с помощью примера кода на языке Delphi и его эффективности при локальном использовании SQL в таблицах Paradox.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




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



:: Главная :: SQL ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-10 07:13:18
2024-05-19 17:12:32/0.01057505607605/2