給出,其中有可能人和Item.Label
需要幾個不同的值,它可能是有意義採用等效模式Person
和Item
集團非標量值
Person Item
------- ------
Id <-----. Id
Name `---- PersonId
Label
間的一種一對多的關係:
Person List Item
-------- ------ ------
Id .--> Id <--. Id
ListId --` `-- ListId
Name Label
這樣很多人可以共享相同的列表。
從第二模式到第一模式的遷移是微不足道的。我的問題是,如何從第一個模式遷移到第二個?
的挑戰是選擇只有一個代表Person
爲
SELECT Label FROM Item WHERE PersonId = ?
每一個可能的結果,我能夠通過使用FOR XML
目前在MS SQL服務器來解決這個問題。也就是,
SELECT P.Id, (SELECT Label FROM Item WHERE PersonId = P.Id FOR XML) list
FROM Person P
然後簡單地SELECT MIN(P.Id) FROM ... GROUP BY list
收集代表。雖然我不滿意這個解決方法,但希望找到更純粹的解決方案。
編輯:
SELECT p.Id, q.Id FROM Person p, Person q
WHERE NOT EXISTS (--symmetric difference between
(SELECT Label FROM Item WHERE PersonId = p.Id) --and
(SELECT Label FROM Item WHERE PersonId = q.id))
應該是人,爲此,代表需要被發現的等價關係。我仍然不知道如何完成,而且這看起來效率很低。
從這個樣子看,一個物品只能在一個列表中? List可能更有意義,包含一個PersonID和一個ItemID。然後,您可以查詢List表中特定人員可能擁有的所有物品,或具有特定物品的所有人員。 – aglassman
@aglassman,在不同的列表中可能有多個具有相同標籤的項目,但是沒有兩個列表可以具有完全相同的項目集合。 –
請指明您的DBMS(SQL Server,MySQL,Oracle等) – ErikE