【发布时间】:2013-01-10 13:41:16
【问题描述】:
我已经创建了一个像这样的连接表:
http://imageshack.us/scaled/landing/822/kantotype.png
我试图找出一个能够选择一些行的查询 - 基于PokémonID - 然后只更新主要“过滤”之后的第一行或第二行。
例如:
假设我想从包含PokémonID = 2 的第二行更改TypeID 的值。我不能简单地使用UPDATE KantoType SET TypeID = x WHERE PokémonID = 2,因为它会改变两行!
我已经尝试使用包含IN、EXISTS 和LIMIT 的子查询,但没有成功。
【问题讨论】:
-
您需要提供有关 Pokemon 和 Type 表的信息,并解释为什么每个 Pokemon 在 KantoType 表中有两条记录。
-
你不能在第二行做 WHERE PokemonID = 2 AND TypeID = 18 吗?如果没有,你如何排列你的行——“第二”行是什么,“第一”行是什么?按 TypeID 排序?
-
其实很简单。如果你玩过神奇宝贝,你就会知道神奇宝贝可以有 1 或 2 种类型。但是,您可以注意到,在我提供的第一个表中,我为每个神奇宝贝添加了 2 种类型(注意:我们可以将 TypeID 视为没有第二种类型的默认值)。关于行的顺序,实际上没有一个:这完全取决于您正在考虑的神奇宝贝。例如,您可能有 2 个具有相同类型(例如钢和岩石)的神奇宝贝,但第一个神奇宝贝的主要类型可能是岩石,另一个是钢......
-
其实我打算在C#项目中使用这个查询。以下是一些有用的链接:imageshack.us/photo/my-images/708/pokmonform.pngimageshack.us/scaled/landing/401/diagramf.png
-
恐怕我还没玩过口袋妖怪。有两种选择。要么您知道要更新的类型,在这种情况下,您可以在查询中对 PokemonID 和 TypeID 使用过滤器。或者如果您不知道 TypeID 但只是想更新“第二”行 - 那么您需要定义行的排序方式(例如,按 TypeID 升序/降序或其他列),这样您就可以告诉 SQL服务器哪一行是第二个。第二个选项的 SQL 由 Mahmoud Gamal 提供。
标签: sql sql-server select junction-table