Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 server SQL Server中联接的高级应用_Sql Server_Jointable - Fatal编程技术网

Sql server SQL Server中联接的高级应用

Sql server SQL Server中联接的高级应用,sql-server,jointable,Sql Server,Jointable,我正在使用一个医院数据库。我正在创建一个视图来查看员工和医生的数量。我的表结构是 create table department( DEPT_ID VARCHAR(5) primary key check(DEPT_id LIKE('D%')), DEPT_NAME VARCHAR(25) not null, DEPT_LOCATION VARCHAR(25) ) CREATE TABLE doctors( DOCT_ID VARCHAR(5) PRIMARY KEY CHECK (D

我正在使用一个医院数据库。我正在创建一个视图来查看员工和医生的数量。我的表结构是

create table department(
DEPT_ID VARCHAR(5) primary key check(DEPT_id LIKE('D%')),
DEPT_NAME VARCHAR(25) not null,
DEPT_LOCATION VARCHAR(25) 
)




CREATE TABLE doctors(
DOCT_ID VARCHAR(5) PRIMARY KEY CHECK (DOCT_ID LIKE('DR%') OR DOCT_ID LIKE ('DC%')),
F_NAME  VARCHAR(25) NOT NULL,
L_NAME  VARCHAR(20),
T_P     CHAR(10) not null,
NIC     CHAR(10),
ADD_LINE1  VARCHAR(10),
ADD_LINE2  VARCHAR(25),
ADD_LINE3  VARCHAR(20),
type varchar(10)  check(type in('regular','call on')),
DEPT_ID    VARCHAR(5) CONSTRAINT FK_DOCT_DEPT FOREIGN KEY REFERENCES DEPARTMENT(DEPT_ID) on delete set null
)



    create table Staff( 

    Staff_id int identity(1,1) primary key,
    F_name Varchar(25) not null ,
    L_name Varchar(25) ,
    Position Varchar(25),
    Tp   char(10),
    Add_line_1 Varchar(25),
    Add_line_2 Varchar(25),
    Add_line_3 Varchar(25),
    Salary money,
    Work_experience_yrs int,
    Dept_id Varchar(5) constraint fk_dept_staff foreign key references department(dept_id)
    )
到目前为止我试过的代码

SELECT dpt.dept_id,
       dpt.dept_name,
       Count(dct.DOCT_ID)num_of_doctors,
       Count(stf.dept_id)AS num_of_staff
FROM   department dpt
       INNER JOIN doctors dct
               ON dpt.DEPT_ID = dct.Dept_id
       INNER JOIN staff stf
               ON stf.Dept_id = dpt.DEPT_ID
GROUP  BY dpt.DEPT_ID,
          dpt.DEPT_NAME 

doctors table             
doct_id     dept_id
dc1         d1
dr1         d1
dr2         d2
dr3         d3
dr4         d3
dr5         d1

staff_id  dept_id
1           d1
2           d1
3           d3
4           d2
5           d3
6           d3

expected result
dept_id   num_of_doct   num_of_staffs
d1          3            2
d2          1            1
d3          2            3

它没有给我期望的结果…请给我建议

当您的科室有3名医生和2名员工时,您的查询将显示3名医生和3名员工,因为您首先加入表格,加入后,员工的记录计数也将是3,因为其科室有3名医生

如果我没有错,你正在寻找这个

SELECT dpt.dept_id,
       dpt.dept_name,
       num_of_doctors,
       num_of_staff
FROM   department dpt
       INNER JOIN (SELECT Count(1) AS num_of_doctors,
                          Dept_id
                   FROM   doctors
                   GROUP  BY DEPT_ID) dct
               ON dpt.DEPT_ID = dct.Dept_id
       INNER JOIN (SELECT Count(1) AS num_of_staff,
                          DEPT_ID
                   FROM   staff
                   GROUP  BY DEPT_ID) stf
               ON stf.Dept_id = dpt.DEPT_ID
我查询的不同之处在于,它将分别计算每个科室的医生和工作人员的数量,并将结果与
科室
表连接

注意:如果你想在一个部门没有职员或医生时显示零作为计数,那么你应该使用
左联接

SELECT dpt.dept_id,
       dpt.dept_name,
       num_of_doctors,
       num_of_staff
FROM   department dpt
       LEFT JOIN (SELECT Count(1) AS num_of_doctors,
                          Dept_id
                   FROM   doctors
                   GROUP  BY DEPT_ID) dct
               ON dpt.DEPT_ID = dct.Dept_id
       LEFT JOIN (SELECT Count(1) AS num_of_staff,
                          DEPT_ID
                   FROM   staff
                   GROUP  BY DEPT_ID) stf
               ON stf.Dept_id = dpt.DEPT_ID

添加示例数据和预期结果如果您将此
Count(stf.dept\u id)更改为num\u of_staff
Count(stf.staff\u id)作为num\u of_staff
我认为这些应该是
左联接
WITH dct_cnt AS (
    SELECT
        dpt.dept_id
        , COUNT(DISTINCT dct.DOCT_ID) num_of_doctors
    FROM
        department dpt INNER JOIN doctors dct ON dpt.dept_id = dct.dept_id
    GROUP BY
        dpt.dept_id
), staff_cnt AS (
    SELECT
        dpt.dept_id
        , COUNT(DISTINCT stf.staff_id) num_of_staff
    FROM
        department dpt INNER JOIN staff stf ON dpt.dept_id=stf.dept_id
    GROUP BY
        dpt.dept_id
)
SELECT
    dpt.dept_id
    , dpt.dept_name
    , dct_cnt.num_of_doctors
    , staff_cnt.num_of_staff
FROM
    department dpt 
    LEFT JOIN dct_cnt ON dpt.dept_id = dct_cnt.dept_id
    LEFT JOIN staff_cnt ON dpt.dept_id = staff_cnt.dept_id