我有一个存储过程需要从同一个 table 中提取信息两次。如何使用关联名称?

I have a stored procedure that needs to pull info from the same table twice. How do I use Correlation Names?

我正在为游戏 Doodle Creatures 创建一个游戏作弊页面。我创建的 table 使用 Combo Animal 的 ID、与它组合的 Gene 以及来自 Animals table 的 New animal 的 ID 来显示信息。 table 看起来像这样:

Creature Combos Table:
ComboID (PK) | NewAnimalID (FK) | ComboAnimalID (FK) | GeneID (FK) |

我创建的 select 来自 Combos table 记录的过程通过加入 Animal 和 Genes table 使用关于组合动物、基因和新动物的信息填充我的数据列表s 基于组合、新动物和基因的 ID。:

CREATE PROCEDURE [dbo].[SelectCreatureCombos]
AS
    SELECT * FROM [CreatureCombos]
    INNER JOIN [Animals] ON [CreatureCombos].[NewCreatureID] = [Animals].[AnimalId]
    INNER JOIN [Animals] ON [CreatureCombos].[ComboAnimalID] = [Animals].[AnimalId]
    INNER JOIN [Genes] ON [CreatureCombos].[ComboGeneID] = [Genes].[GeneId] ;

程序的预期结果:

(New) Animal (Name) | AnimalImg | AnimalAltText | AnimalToolTip | (Combo) Animal (name) | AnimalImg | AnimalAltText | AnimalToolTip | Gene | GeneImg | GeneAltText | GeneToolTip | 

当我 运行 页面时,出现以下错误:

The objects "Animals" and "Animals" in the FROM clause have the same exposed names. Use correlation names to distinguish them.

我必须承认我对SQL还是有点陌生​​;我可以像专业人士一样插入、select 和更新,但连接、别名和相关名称有点超出我的能力范围。任何其他建议将不胜感激。谢谢!

如果是这种情况,您需要做的就是在 table 名称上提供一个 ALIAS 以避免名称冲突。例如

SELECT * 
FROM [CreatureCombos]
     INNER JOIN [Animals] AS Animal1 
           ON [CreatureCombos].[NewCreatureID] = Animal1.[AnimalId]
     INNER JOIN [Animals] AS Animal2 
           ON [CreatureCombos].[ComboAnimalID] = Animal2 .[AnimalId]
     INNER JOIN [Genes] 
           ON [CreatureCombos].[ComboGeneID] = [Genes].[GeneId] 

我认为 table design.In [CreatureCombos] 中存在问题删除了列 [NewCreatureID] 和 [ComboAnimalID]。添加一列调用 AnimalID 和第二列作为 AnimalType int( 1,2等)

所以在这个设计中只有一个 Animal1 join 并且你可以通过类型识别 AnimalType。

此外,如果有更多的动物类型或类别,那么您会怎么做?

所以推荐设计更加灵活开放的类型。