2012-05-10 15 views
0

您好,我有一个带有数据和2个小问题的表格结构。如何至少有一个孩子使用两个表格才能选择父行

CREATE TABLE [dbo].[Parent] (
    [id] [int] NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Parent] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Child1] (
    [Child1Id] [int] NOT NULL, 
    [ParentId] [int] NOT NULL, 
    [SomeData] [int] NOT NULL, 
CONSTRAINT [PK_Child1] PRIMARY KEY CLUSTERED 
(
    [Child1Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Child2] (
    [Child2Id] [int] NOT NULL, 
    [ParentId] [int] NOT NULL, 
    [SomeData] [int] NOT NULL, 
CONSTRAINT [PK_Child2] PRIMARY KEY CLUSTERED 
(
    [Child2Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


INSERT INTO Parent VALUES(1,'Name 1') 
INSERT INTO Parent VALUES(2,'Name 2') 
INSERT INTO Parent VALUES(3,'Name 3') 
INSERT INTO Parent VALUES(4,'Name 4') 


INSERT INTO [Child1] VALUES(1,1,50) 
INSERT INTO [Child1] VALUES(2,1,125) 
INSERT INTO [Child1] VALUES(3,2,255) 


INSERT INTO [Child2] VALUES(1,1,2) 
INSERT INTO [Child2] VALUES(2,2,4) 
INSERT INTO [Child2] VALUES(3,2,8) 
INSERT INTO [Child2] VALUES(4,3,16) 
  1. 如何选择所有parets与两个表中至少有一个孩子类型的记录。 我没有一个查询 ,但我不知道最佳的方式来显示这个总数记录

    SELECT p.Name,计数(Child1),计数(CHILD2)

  2. 如何选择只有所有parets记录在两个表中都存在? SELECT p.Name,count(Child1),count(Child2)

Thanks in Advice。

回答

2

查询1:

--at least one child record in either Child1 or Child2 
select distinct p.* 
from parent p 
left outer join child1 c1 on p.id = c1.ParentId 
left outer join child2 c2 on p.id = c2.ParentId 
where coalesce(c1.ParentId, c2.ParentId) is not null 

查询2:

--at least one child record in both Child1 and Child2 
select distinct p.* 
from parent p 
inner join child1 c1 on p.id = c1.ParentId 
inner join child2 c2 on p.id = c2.ParentId 

注意:如果你只是想显示的父记录的数量,改变

select distinct p.* 

select count(distinct p.id) 

在任一查询中。

+0

嗨RedFilter,我需要在每个子表中callulate记录计数。我需要得到reuslt像:名称,计数(fromChild1),计数(fromChild2) –

+0

@cleric请提供所需的输出示例。例如 – RedFilter

+0

结果应该是这样的:Name 1 | 2(在child1中计数)| 1(在child2中计数),名称2 | 1(在child1中计数)| 3(在child2中计数)等 –

相关问题