2011-12-23 4 views
2

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

Например, person.personid = '1234' и department.personid = '12345'.

Есть ли SQL-оператор, в котором я могу использовать первые 4 или 5 символов первичных ключей или есть ли какие-либо другие методы, которые я могу использовать.


ОБНОВЛЕНИЕ: Мои искренние извинения. Я имею дело с двумя таблицами. "dyndomrun.ddid" имеет основной ключ, а "domainregion.domainid" не имеет никакого первичного ключа и внешнего ключа. Таблица «dyndomrun» DDL устанавливается в "character varying" и имеет 8 символов, тогда как таблица DDL «domainregion» также имеет значение «character variable», но имеет 10 символов.

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

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

Я попытался JOINS, ВНУТРЕННИЙ не JOINS, LIKE, ни один из них, кажется, работает. База данных, с которой я имею дело, основана на базе SQL, основанной на PostgreSQL.

Просьба сообщить.

+2

Какой двигатель базы данных? MySQL? SQL Server? Oracle? Другие? – ean5533

+1

Я бы создал таблицу сопоставления с столбцами p_person_id и d_person_id –

+2

Как правило, вы не сопоставляете первичные ключи между таблицами - внешний ключ одной таблицы ** ссылается на первичный ключ ** другой таблицы ** - и эти два должны быть одинаковыми в их типе данных –

ответ

1

Ваш вопрос не имеет смысла. Мы не сопоставляем первичный ключ одной таблицы с первичным ключом другой таблицы.

Теперь мы сопоставляем внешний ключ зависимой таблицы с первичным ключом ссылочной таблицы. Но в этом случае значение столбца в обеих таблицах должно совпадать. 12345 в DEPARTMENT.PERSONID должен обратиться к записи 12345 в PERSON.PERSONID, потому что 1234 в .PERSON.PERSONID - это буквально другой человек.

Возможно, вы работаете с удачной моделью данных, в которой зависимая таблица имеет некоторый интеллектуальный ключ, только часть которого относится к родительскому ключу. Если это так, мои соболезнования. Но вам нужно дать некоторые конкретные детали и некоторые признаки аромата СУБД (потому что решения будут различаться в разных продуктах).

Но ваша самая большая проблема заключается в следующем: когда вы пытаетесь применить реляционную целостность на что-либо, кроме равенства между столбцами вы рискуете сращивания 1234 в .PERSON.PERSONID с 1234 в DEPARTMENT.PERSONID, 12345 в DEPARTMENT.PERSONID и123456 в DEPARTMENT.PERSONID. Это, вероятно, не то, что вы хотите.

1

вы имели в виду что-то вроде

select * 
    from t1 
    , t2 
where to_char(t1.id) = substr(t2.id,1,4) 

Или другим способом:

select * 
    from t1 
    , t2 
where t1.id = round(t2.id/10) 

Оба эти решения предполагает, что t1.id является один символ короче t2.id.

НТН

+0

Моя проблема заключается в том, что мне нужно выбрать список полей из конкретной таблицы, и они также вызывается в другой таблице в качестве первичного ключа, только с различным набором символов в первичном ключе. Тип первичного ключа - «меняющийся характер», поэтому он указывает на эту ошибку «Нет функции, которая соответствует указанному имени и типам аргументов. Возможно, вам придется добавлять явные типы приведения». – Jeiman

1

Попробуйте это ...

SELECT * 
    FROM person 
INNER JOIN department ON person.personid = LEFT(department.personid,4) 
Смежные вопросы