Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择祖父母_Sql_Sql Server_Join - Fatal编程技术网

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

我的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),

  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)