我有两张桌子1.人和2.孩子
CREATE TABLE Persons (
PersonID int,
Name varchar(255)
);
CREATE TABLE Children (
ChildID int,
PersonID int,
Name varchar(255),
DOB Date);
我将它们与左连接组合在一起。
select
person.PersonID
, person.Name
, child.childID
, Child.DOB
FROM(
select PersonID
, Name
From Persons
) as person
left join (
select ChildID
, PersonID
, Name
, DOB
From Children
Order By DOB ASC
) as child
on child.PersonID = person.PersonID
结果显示一个人的出生日期与孩子的关系。直到那时这很好。我想要的人将按照他们的身份和儿童名单进行升序排序。他们的出生日期将按照升序排序。但似乎孩子们是按随机顺序来的。我试图按结果排序,但这不符合我的目的。 我想要PersonID升序,每个人的子列表将按其出生日期的升序排序。
以下是我执行的表和查询的链接http://sqlfiddle.com/#!9/b56f95/3。
答案 0 :(得分:1)
您的查询未明确排序,在这种情况下,它们似乎是由PersonID排序的,但并不总能保证。子查询的顺序也不会改变外部查询的顺序。
如果将订单从子查询移到外部查询中,输出将被正确排序:
select
person.PersonID
, person.Name
, child.childID
, Child.DOB
FROM(
select PersonID
, Name
From Persons
) as person
left join (
select ChildID
, PersonID
, Name
, DOB
From Children
) as child
on child.PersonID = person.PersonID
order by child.DOB
如果您希望将每个父母的孩子列在一起,例如:
Parent 1, Child 1
Parent 1, Child 2
Parent 2, Child 1
Parent 3, Child 1
Parent 3, child 2
您也可以按PersonID添加订单:
select
person.PersonID
, person.Name
, child.childID
, Child.DOB
FROM(
select PersonID
, Name
From Persons
) as person
left join (
select ChildID
, PersonID
, Name
, DOB
From Children
Order By DOB ASC
) as child
on child.PersonID = person.PersonID
order by person.PersonID, child.DOB
这将首先通过人员表中的PersonID对结果进行排序,然后通过他们的DOB对每个父母的子女进行排序
答案 1 :(得分:0)
即使您明确排序,JOIN
也不会保留您的行排序。您需要在之后进行排序:
SELECT
person.PersonID
, person.Name
, child.childID
, Child.DOB
FROM Persons AS person
LEFT JOIN Children AS child
ON child.PersonID = person.PersonID
ORDER BY PersonID, DOB
我删除了ORDER BY
中的JOIN
,并在外部查询的末尾添加了一个。{/ p>
我还优化了SELECT
和JOIN
中的子查询,因为您可以使用FROM Persons AS person
和LEFT JOIN Children AS child
来完成同样的事情。
答案 2 :(得分:0)
您可以简化查询并按两列排序结果:
select
person.PersonID
, person.Name
, child.childID
, Child.DOB
From Persons as person
left join Children as child
on child.PersonID = person.PersonID
Order By PersonID, DOB
逻辑上,在创建查询结果后应用ORDER BY。在这种情况下,它是一个简单的ORDER BY,首先是ID,然后是DOB。