SQL-поиск без дубликатов - PullRequest
       4

SQL-поиск без дубликатов

0 голосов
/ 04 ноября 2018

Хорошо, я пытаюсь узнать, как лучше выполнить поиск. У меня 40 столов. В 40 таблицах все таблицы имеют 2 одинаковых столбца, идентификатор и дату; все таблицы, очевидно, имеют другие столбцы, которые не совпадают. Теперь не каждая таблица используется пользователем. Пользователь может использовать 5 таблиц, он может использовать все 40. Также к идентификаторам может быть прикреплено несколько дат. Я хотел бы получить ВСЕ даты из всех 40 таблиц из идентификатора без дубликатов. АКА, если таблица 1 и таблица 10 имеют одну и ту же дату, я хочу ее только 1 раз.

Итак, у меня есть несколько вопросов.

Первый способ, который я прочитал, - это.

 $stmt = $this->con->prepare("SELECT date FROM table1 
 left join table2 on table1.id = table2.id
 left joins for table2--->table40
 WHERE ID = ?
 GROUP BY date");

Второй способ, который я видел, такой:

 $stmt = $this->con->prepare("SELECT Distinct date FROM table1 
 left join table2 on table1.id = table2.id
 left joins for table2--->table40
 WHERE ID = ?");

и третий способ, который я прочитал, - это. (их слова не мои) «По своему опыту (который ограничен между прочим) я использовал для этого запрос равного соединения. Позвольте мне показать вам пример.

Рассмотрим три таблицы с именами Table1, Table2 и Table3 с общим столбцом с именем Code (обращенным к ID). Приведенный ниже фрагмент кода объединяет эти три таблицы без дубликатов: "

 select date from Table1, Table2, Table3..... where Table1.ID=Table2.ID=Table3.ID......;

Теперь мой вопрос: как мне правильно выполнить этот поиск?

Должен возвращаться список дат, найденных для 1 идентификатора (который ищется) без дубликатов.

1 Ответ

0 голосов
/ 04 ноября 2018

Ваш первый и третий подход отличаются только синтаксисом (первый подход имеет правильный синтаксис, а третий использует архаичный синтаксис, который не должен использоваться для каких-либо новых разработок в течение последних 15+ лет).

Все три подхода страдают от одной и той же проблемы: когда Table1 не имеет идентификатора цели, присутствие или отсутствие этого идентификатора в других таблицах не имеет значения: вы не получите от них никаких дат, если Table1 не имеет идентификатор цели.

Вы можете исправить это, используя UNION на отдельных выборках, например:

SELECT date
FROM (
    SELECT date FROM Table1 WHERE Id=?
UNION
    SELECT date FROM Table2 WHERE Id=?
UNIO
    SELECT date FROM Table3 WHERE Id=?
UNION
    ...
UNION
    SELECT date FROM Table40 WHERE Id=?
) AS x

Это даст все значения date независимо от таблицы, в которой оно найдено.

Примечание: К сожалению, побочным эффектом этого подхода является необходимость привязать параметр Id сорок раз, поскольку JDBC не поддерживает именованные параметры.

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