【问题标题】:SQLite -Complex SELECT with multiple joinsSQLite - 具有多个连接的复杂 SELECT
【发布时间】:2018-04-27 06:31:58
【问题描述】:

我有以下各列的示例表:

PEOPLE: PERSON_ID, FIRST_NAME, LAST_NAME, GUARDIAN_ID

STATUS: PERSON_ID, STATUS

样本数据:

PEOPLE:
    2345, George, Foreman, null
    4567, Joseph, Galagar, 2345
    5632, Jenner, Shooter, 2345

STATUS:
    2345, DISPATCHED
    4567, PENDING
    5632, PENDING

鉴于上述情况,我希望从PEOPLE 中检索PERSON_ID,其中FIRST_NAME 是'George',还有来自STATUS 的那些人的STATUS,最后是这些人中每个人的孩子数有(换句话说,依靠PEOPLE,其中PERSON_IDGUARDIAN_ID)。

我该怎么做?我在这方面非常生疏。这是一个不好的例子,但应该有助于解决我的实际问题。

鉴于上述情况,我应该得到以下结果:

2345, DISPATCHED, 2

【问题讨论】:

  • 提供一些示例数据。这会有所帮助。
  • 能否提供一些示例数据?
  • 你试试我的答案。它有用还是有什么问题?

标签: sql database sqlite join


【解决方案1】:

试试这个:

CREATE TABLE PEOPLE(PERSON_ID INT, FIRST_NAME VARCHAR(25), LAST_NAME VARCHAR(25), GUARDIAN_ID INT);

INSERT INTO PEOPLE VALUES(2345, 'George', 'Foreman', null);
INSERT INTO PEOPLE VALUES(4567, 'Joseph', 'Galagar', 2345);
INSERT INTO PEOPLE VALUES(5632, 'Jenner', 'Shooter', 2345);

CREATE TABLE STATUS(PERSON_ID INT, STATUS VARCHAR(25));

INSERT INTO STATUS VALUES(2345, 'DISPATCHED');
INSERT INTO STATUS VALUES(4567, 'PENDING');
INSERT INTO STATUS VALUES(5632, 'PENDING');

使用查询,我们得到结果:

SELECT P.PERSON_ID
    ,MAX(S.STATUS)STATUS
    ,MAX(D.Counts)[No of Children]
FROM PEOPLE P
JOIN STATUS S ON S.PERSON_ID = P.PERSON_ID
JOIN(SELECT GUARDIAN_ID, COUNT(1)Counts FROM PEOPLE GROUP BY GUARDIAN_ID) D ON D.GUARDIAN_ID = P.PERSON_ID
WHERE P.FIRST_NAME = 'George'
GROUP BY P.PERSON_ID

输出:

PERSON_ID   STATUS      No of Children
2345        DISPATCHED  2

#SQL Fiddle 中查看此内容

【讨论】:

  • @pnizzle,很好。我希望上面的答案会奏效。试试看,如果有任何问题,请写在评论中。
【解决方案2】:

或者为了简化并保存一个嵌套选择,

select p.PERSON_ID, max(s.STATUS) as status, 
sum (case when kids.person_id is null then 0 else 1 end) as num_children
from PEOPLE p
left join PEOPLE kids on kids.GUARDIAN_ID = p.PERSON_ID
join STATUS s on s.PERSON_ID = p.PERSON_ID
where p.FIRST_NAME = 'George'
group by p.PERSON_ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2013-01-16
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多