【发布时间】:2020-10-15 20:47:48
【问题描述】:
我有四张桌子
applicationmaster, projectdetails, clientdetails, employeedetails
我有一个存储过程,可以通过加入这四个表来返回所有列,例如 - applicationmaster 可能有雇员,也可能没有雇员。
applicationmaster 和员工详细信息都使用 app_id 进行映射。如果 app_id 存在,我想从 employeedetails 表中检索所有数据,如果不存在,则为员工详细信息的所有列返回 null
applicationmaster employeedetails
app_id | app_name | cotractor emp_id | app_id | emp_name | emp_designation
1 BPM X 101 1 Tony Manager
2 CRM Y 102 1 Mark Consultant
3 Portal Z
在这里,我有两个 app_id 1 的员工。所以我想检索如下:
1 BPM X 101 Tony Manager
1 BPM X 102 Mark Consultant
2 CRM Y null null null
3 Portal Z null null null
但我的存储过程只返回具有雇员的 applicationmaster 表中的那些行。
就像我的存储过程只返回前两行一样。
ALTER PROCEDURE [dbo].[sp_Dashboard_SowReport]
AS
BEGIN
SELECT
am.app_id AS 'App Id',
cd.app_name AS 'App Name',
cd.scheduler_name AS 'Scheduler Name',
pd.project_name AS 'Project Name',
pd.Project_id AS 'Project Id',
MONTH(am.app_end_date) AS 'App Expiring Month',
DATEDIFF(Day,am.app_start_date,am.app_end_date) AS 'Contract due in days',
ed.associate_name AS 'Associate Name',
ed.emp_id AS 'EID',
ed.client_id AS 'Client Id',
ed.bill_rate_per_hour AS 'Bill Rate'
FROM
applicationMaster am
JOIN
projectdetails pd ON (am.project_id = pd.project_id)
JOIN
clientdetails cd ON (cd.client_id = pd.client_id)
JOIN
employeedetails ed ON (ed.app_id = am.app_id)
END
有人可以帮我吗?我正在学习编写和优化 SQL 查询
谢谢
【问题讨论】:
-
只要有“加入”,你就是在做一个内部连接。需要左加入
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本没有前缀! -
注明。谢谢 marc_s
标签: sql sql-server select left-join sql-server-2016