Как объединить две таблицы, одна из которых не имеет первичного ключа и не имеет одинаковую длину символов - PullRequest
0 голосов
/ 26 декабря 2011

Я имею дело с двумя таблицами: "dyndomrun.ddid" = с первичным ключом и "domainregion.domainid" = без какого-либо первичного ключа или внешнего ключа.

Определение "dyndomrun.ddid" является "изменяющимся символом" и имеет 8 символов, тогда как определение "domainregion.domainid" также является "изменяющимся символом", но имеет 10 символов.

Проблема: существуютнекоторые поля в таблице domainregion, которые необходимо объединить с первичным ключом в таблице dyndomrun.Кажется, я не могу сделать это с помощью простого оператора JOIN, такого как ниже:

SELECT domainregion.domainid, domainregion.dombegin, domainregion.domend, dyndomrun.ddid 
FROM domainregion, dyndomrun 
WHERE domainregion.domainid = dyndomrun.ddid 
ORDER BY domainregion.domainid, dyndomrun.ddid, domainregion.dombegin, domainregion.domend;

Я пробовал JOINS, INNER JOINS, LIKE, кажется, ни один из них не работает.База данных, с которой я имею дело, основана исключительно на SQL и хранится с использованием PostgreSQL.

Есть ли метод, который я могу использовать, в котором он выбирает domainregion.domainid на основе длины символа и сопоставляя его с dyndomrun.ddid?

Пожалуйста, сообщите.

1 Ответ

1 голос
/ 27 декабря 2011

Попробуйте сравнить только первые 8 символов:

SELECT r.domainid, r.dombegin, r.domend, d.ddid 
FROM   domainregion r
JOIN   dyndomrun d ON r.domainid::varchar(8) = d.ddid 
ORDER  BY r.domainid, d.ddid, r.dombegin, r.domend;

Приведение неявно обрезает конечные символы. ddid имеет только 8 символов для начала. Нет необходимости обрабатывать это тоже. Это достигает того же:

JOIN   dyndomrun d ON left(r.domainid, 8) = d.ddid 

Однако учтите, что строковая функция left() появилась только в PostgreSQL 9.1. В более ранних версиях вы можете заменить:

JOIN   dyndomrun d ON substr(r.domainid, 1, 8) = d.ddid

__

Основные объяснения для начинающих:

  • В запросе используется JOIN. Подробнее об этом читайте в руководстве .

  • FROM domainregion r - это сокращение от FROM domainregion AS r. AS - это просто шум в этом случае в PostgreSQL. Псевдоним таблицы делает запрос короче и проще для чтения, но здесь не оказывает никакого другого влияния. Например, вы можете использовать псевдонимы таблиц, чтобы включить одну и ту же таблицу несколько раз.

  • Условие соединения ON r.domainid::varchar(8) = d.ddid объединяет только те строки, где два выражения точно совпадают. Снова, прочитайте об этих основах в руководстве (или любом другом источнике).

Это простой запрос, здесь не так много объяснений.

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