как получить результаты запроса типа «многие ко многим», чтобы он действовал как запрос «один ко многим» в SQL? - PullRequest
0 голосов
/ 08 марта 2012

ОК. Я постараюсь набросать простой пример, чтобы продемонстрировать, что я хотел бы сделать.

Допустим, у нас был стол с людьми, у которых были домашние животные, и у них могла быть только одна кошка и одна собака. извините, я не уверен, как очень хорошо создавать таблицы на сообщениях о переполнении стека, он не хочет позволять мне использовать HTML-теги таблиц. например:

Table name: PetOwners

columns: OwnerName, Cat, Dog

example rows:

Bob,Saimese,Lab
Cindy,Tabby,Poodle

Но затем я хотел реализовать это многими многими способами по другим причинам, например, для планирования будущего БД. Поэтому я разделил это на таблицы:

Table name: Owners

columns: OwnerID,OwnerName

example rows:

1,Bob
2,Cindy

Table name: Pets

columns: OwnerID,Pet,isCat,isDog

example rows:

1,Saimese,y,n
2,Lab,n,y
3,Tabby,y,n
4,Poodle,n,y


Table name: Link

columns: OwnerID,PetID

example rows:

1,1
1,2
2,3
2,4

Итак, теперь мой вопрос состоит в том, как подделать результаты выбора всех из моей исходной таблицы (select * from PetOwners) с моей текущей структурой, предполагая, что все данные будут такими, и каждый владелец домашнего животного будет иметь одну кошку и одну собаку .

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

EDIT

хорошо, мои извинения, но я не думаю, что я был ясен, я хотел бы попытаться вернуть результаты обратно, как если бы я запустил select * from PetOwners. иначе я хочу видеть его в одной строке , например:

Боб, Saimese, Lab

когда я пытаюсь выполнить запрос из ответа № 1, я получаю:

Боб, NULL, Lab Боб, Saimese, NULL

Это то, с чем я боролся, и поэтому я и написал этот вопрос. опять же, я не уверен, что вы можете написать SQL, чтобы он действительно возвращался в одной строке, но дайте мне знать, если есть, спасибо. о, и я на самом деле неправильно понял структуру таблицы в первом вопросе. Я использую три таблицы, чтобы эмулировать многие ко многим, я отредактирую это, чтобы показать это, но я не думаю, что это действительно что-то меняет (вы просто присоединяетесь к «таблице связей» с владельцами домашних животных сначала конечно). спасибо!

Ответы [ 2 ]

2 голосов
/ 08 марта 2012
SELECT   OwnerName, cat.Pet, dog.Pet
FROM     Owners
         INNER JOIN Pets cat
             ON cat.OwnerID = Owners.OwnerID
             AND cat.IsCat = 'Y'
             AND cat.IsDog = 'N'
         INNER JOIN Pets dog
             ON dog.OwnerID = Owners.OwnerID
             AND dog.IsCat = 'N'
             AND dog.IsDog = 'Y'

Хотя я бы принял предложение Дэвида Бебера о столбце PetType вместо нескольких флагов Y / N.

2 голосов
/ 08 марта 2012
SELECT ownerID, cat AS pet, 'y' AS isCat, 'n' AS isDog
  FROM PetOwners
 WHERE cat IS NOT NULL
 UNION
SELECT ownerID, dog AS pet, 'n' AS isCat, 'y' AS isDog
  FROM PetOwners
 WHERE dog IS NOT NULL

Это должно сработать.Кроме того, вам может быть лучше использовать столбец petType вместо использования набора флагов - при настройке его вам придется добавлять столбец, когда кто-то владеет кроликом, хорьком и т. Д.

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