背景
我对SQL的整个JOIN概念有点新,并尝试编写一个SQL语句,该语句将根据另一个表中的总统ID获取一个国家/地区的名称,后者指向另一个包含的表这个国家的名字。
表格
[总统]
ID | PresidentID | Name | Population Governed
1 3 ME 1,000,000,000
[CountryPopulation]
ID |PresidentID| Population Number| CountryID
1 3 1,000,000,000 12
[国家或地区名称]
ID | CountryID | CountryName
3 12 USA
问题:我写了一个SQL语句,我试图根据总统ID获取国家/地区的名称,但是我的陈述显示错误:
不明确的列名称' PresdientID'。
SQL语句
SELECT
PresidentID
FROM
President A
INNER JOIN
CountryPopulation B ON A.PresdientID = B.PresdientID
WHERE
B.CountryID IN (SELECT CountryName
FROM CountryName
WHERE CountryID = B.CountryID)
答案 0 :(得分:2)
SQL Server不确定您是否要返回A.PresidentID或B.PresidentID。即使在这种情况下值仍然相同,您也需要指定。
答案 1 :(得分:2)
您选择的字段PresidentID
不明确。您需要指定要为PresidentID
提供值的表格,如下所示:
Select
A.PresdientID
From President A INNER JOIN
CountryPopulation B ON A.PresdientID = B.PresdientID
WHERE B.CountryID IN (SELECT CountryName FROM CountryName WHERE CountryID = B.CountryID)
修改强>
您的问题表明您正在尝试根据CountryName
值获取PresidientID
。
如果您知道PresidientID
值,我会认为您只是这样做:
DECLARE @PresidientID INT = 3
SELECT cn.CountryName
FROM CountryName cn JOIN CountryPopulation cp ON cn.CountryID = cp.CountryID
WHERE cp.PresidientID = @PresidientID;
也就是说,您的数据库设计可能不正确。似乎有很多" ID"田野洒满了。例如,您的President
表包含ID
字段和PresidientID
字段;您的CountryName
表格同时包含ID
字段和CountryID
字段。此外,您在多个表中拥有相同的信息(人口编号,受管人口)。
将所有国家/地区属性放入名为Country
的单个表中会不会更好?考虑一下:
CREATE TABLE [Country](
[ID] int IDENTITY(1,1) NOT NULL,
[Name] nvarchar(100) NOT NULL,
[Population] INT,
[PresidentID] INT -- Foreign Key to president
)
CREATE TABLE [President](
[ID] int IDENTITY(1,1) NOT NULL,
[PresidentName] nvarchar(100) NOT NULL
)