Как мне объединить эти две таблицы базы данных в один набор результатов?

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

Домашние питомцы

PetId INT PK
Name  VARCHAR(100)

PetOtherNames

PetID INT PK FK
Name VARCHAR(100) PK

Итак, у меня есть таблица домашних животных. Имя (в этой таблице) является их официальным общим названием. У каждого питомца могут быть другие имена от нуля до многих. Эти имена никогда не отображаются, НО должны использоваться в поисковом запросе.

Итак, давайте посмотрим на некоторые данные.

Данные домашних животных

1. Fred
2. Barney
3. Foo
4. Megan Fox (boom tish)

Данные PetsOtherName

2. B-b-b-Barney
2. Bannana Barney
2. Banannarama
4. TapTap

Итак... если я сделаю ПРОСМОТР этих двух таблиц, я ожидаю следующих результатов....

SELECT *
FROM PetsView
ORDER BY PetId, Name

1. Fred
2. B-b-b-Barney
2. Barney
2. Bannana Barney
2. Banannarama
3. Foo
4. Megan Fox
4. TapTap

И это позволит мне сделать следующее....

SELECT PetId, Name
FROM PetsView
WHERE CONTAINS(Name, 'Fox')

... и возвращается 4. Лиса

SELECT PetId, Name
FROM PetsView
WHERE CONTAINS(Name, 'Fox')

... и возвращает 4. TapTap

ваше здоровье :)

PS. Я не уверен, что придумал название этого поста, поэтому, пожалуйста, отредактируйте его соответствующим образом (или предложите лучшее название, чтобы я его обновил).

Обновление: это для sql2008, но я предполагаю, что результатом будет tsql .. поэтому он должен/может применяться по всем направлениям.


person Pure.Krome    schedule 25.05.2009    source источник


Ответы (2)


Создайте представление, которое создает UNION двух таблиц:

CREATE VIEW PetsView AS
SELECT * FROM Pets
UNION
SELECT * FROM PetOtherNames
person Rune Grimstad    schedule 25.05.2009
comment
Попробуйте явно выбрать столбцы. Скорее всего, ваши таблицы не имеют одинаковых столбцов. - person Rune Grimstad; 25.05.2009
comment
Ага. мне тоже нужно было это сделать. как только я это сделал, все было хорошо :) - person Pure.Krome; 25.05.2009

Не для того, чтобы украсть гром, но я был укушен тем, что раньше не использовал UNION ALL.

По сути, если у вас есть одна и та же комбинация petId-Name в любой таблице, в результирующем наборе появится только одна запись, если вы просто используете UNION. Используя UNION ALL, вы увидите дубликаты (которые вам могут понадобиться или не понадобиться).

CREATE VIEW PetsView AS
SELECT petId, [Name] FROM Pets
UNION ALL
SELECT petId, [Name] FROM PetOtherNames

(В SQL Server «имя» является ключевым словом, поэтому я использовал экранирующую скобку)

person Jeff Meatball Yang    schedule 25.05.2009
comment
Я думаю, что имя - это ключевое слово в SQL Server. Попробуйте это: CREATE VIEW PetsView AS SELECT petId, [Name] FROM Pets UNION ALL SELECT petId, [Name] FROM PetOtherNames - person Jeff Meatball Yang; 25.05.2009
comment
ура, но я уверен, что хочу СОЮЗ, а не СОЮЗ ВСЕХ. Если идентификатор + имя отображается в обеих таблицах, мне нужно, чтобы он был указан только ОДИН РАЗ. Надеюсь, он будет существовать в обоих... :) (могу ли я сделать уникальное ключевое ограничение?) - person Pure.Krome; 25.05.2009
comment
(Обновление) У меня были разные поля в обеих таблицах, поэтому изначально это не сработало. Я перечислил поля, которые существуют, и это работает. (я также удалил свой предыдущий комментарий о том, что он не работает). - person Pure.Krome; 25.05.2009
comment
Хороший! Используйте UNION, который эффективно всегда даст вам уникальные результаты. - person Jeff Meatball Yang; 25.05.2009