SQL选择祖父母
我的sql课程有一个问题,关于选择所有有孙子的人,并列出他们有多少孙子SQL选择祖父母,sql,sql-server,join,Sql,Sql Server,Join,我的sql课程有一个问题,关于选择所有有孙子的人,并列出他们有多少孙子 CREATE TABLE person ( persID INT IDENTITY(1,1), persFName VARCHAR(30) NOT NULL, persLName VARCHAR(30) NOT NULL, persDOB DATE, motherID INT, fatherID INT, persDOD DATE, persGender CHAR(1), PRI
CREATE TABLE person (
persID INT IDENTITY(1,1),
persFName VARCHAR(30) NOT NULL,
persLName VARCHAR(30) NOT NULL,
persDOB DATE,
motherID INT,
fatherID INT,
persDOD DATE,
persGender CHAR(1),
PRIMARY KEY (persID)
);
CREATE TABLE couple (
coupleID INT IDENTITY(1,1),
alphaSpouse INT NOT NULL,
omegaSpouse INT NOT NULL,
coupleStart DATE NOT NULL,
coupleEnd DATE,
PRIMARY KEY (coupleID),
FOREIGN KEY (alphaSpouse) REFERENCES person(persID),
FOREIGN KEY (omegaSpouse) REFERENCES person(persID)
);
这是我目前的查询,它得到了一些数据,但不是全部数据,也不确定我哪里出错了:(
您的查询仅选择母亲的母亲和父亲的父亲作为祖父母 不要将您的查询拆分为特定的谱系(父亲的父亲、父亲的母亲等),只需使用“如果此人是母亲或父亲”加入即可:
请注意,结果可能需要重复,特别是如果存在任何“近亲繁殖”在这些家谱中。你能添加一些样本数据、你得到的结果和你期望得到的结果吗?当我们看到导致问题的数据时,就更容易找出问题所在。p.motherID为null-这可能是可疑的。祖父母能有父母吗?问题是你只能找到外祖母和外祖母父亲……你还需要把母亲、父亲和母亲联系起来。正如@DanK所指出的:你父亲的母亲不是你的祖母吗?与其将其分成4个部分并使用联合体,你可能应该修改你的加入标准。非常感谢!!我不知道我可以在一张桌子上加入or操作员,学到了一些新的东西w!@therrienri-您可以在WHERE子句中使用的任何运算符也可以在ON子句中使用(例如AND,或类似于…)。干杯!近亲繁殖问题可以通过执行
COUNT(DISTINCT gm.persID)
@therrienri来解决,或者在连接条件下完全有效,但是在大型数据集的实践中(合理适用时)通常,您最好像以前那样合并类似的查询(但在这种情况下,您需要合并4个查询……对于曾孙辈来说,这将是8个查询,这变得“不合理”)因为或几乎破坏了MySQL利用索引的能力。很高兴知道!我认为我在我的联盟中遗漏了一些案例,但在一个连接中的OR肯定更干净、更容易理解:)
select (p.persFName+' '+p.persLName) as GrandParent, count(*) as Number_Of_Grandchildren --gets all the grandmothers
from person as p
join person as c on c.motherID=p.persID
join person as gm on gm.motherID=c.persID
where p.motherID is null
group by (p.persFName+' '+p.persLName)
union
select (p.persFName+' '+p.persLName) as GrandParent, count(*) as Number_Of_Grandchildren --gets all the grandfathers
from person as p
join person as d on d.fatherID=p.persID
join person as gf on gf.fatherID=d.persID
where p.fatherID is null
group by (p.persFName+' '+p.persLName);
from person as p
join person as c on ( c.motherID = p.persID OR c.fatherID = p.persID)
join person as gm on (gm.motherID = c.persID OR gm.fatherID = c.persID)