【发布时间】:2022-12-09 17:01:58
【问题描述】:
要求:从第一个表中列出所有客户,然后从第二个表和第三个表中提取任何符合条件的类,第三个表仅连接到第二个。
我试过的:
- 当我在第三个表上使用 JOIN 时,我没有得到所有的客户(例如,“Bobby Black”)。
- 当我在第三张表上使用 LEFT JOIN 时,我得到了所有的客户,但是
然后是所有课程(例如,Jane Doe 的“PST”课程)!
简化示例:
DECLARE @T1_Customers TABLE (T1_Customer_id INT, T1_FName VARCHAR(50), T1_LName VARCHAR(50)) INSERT INTO @T1_Customers VALUES (1,'John','Darwin'), (2,'Jane','Doe'), (3,'Bobby','Black') DECLARE @T2_Classes TABLE (T2_Class_id INT, T2_Customer_id INT, T2_ClassType_id INT, T2_ClassName VARCHAR(50), T2_Status VARCHAR(50)) INSERT INTO @T2_Classes VALUES (1,1,1,'Emergency Medical Dispatch v1','Pass'), (2,1,2,'Emergency Medical Dispatch Instructor','Pass'), (3,2,3,'Public Safety Telecommunicator','Pass'), (4,2,1,'Emergency Medical Dispatch v1','Pass'), (5,2,1,'Emergency Medical Dispatch v2','Fail') DECLARE @T3_ClassTypes TABLE (T3_ClassType_id INT, T3_ClassType VARCHAR(50)) INSERT INTO @T3_ClassTypes VALUES (1,'EMD'), (2,'EMD-I'), (3,'PST') --SELECT * FROM @T1_Customers SELECT * FROM @T2_Classes SELECT * FROM @T3_ClassTypes --FIRST ATTEMPT SELECT * FROM @T1_Customers LEFT JOIN @T2_Classes ON T2_Customer_id = T1_Customer_id AND T2_Status != 'Fail' JOIN @T3_ClassTypes ON T3_ClassType_id = T2_ClassType_id AND T3_ClassType != 'PST' --SECOND ATTEMPT SELECT * FROM @T1_Customers LEFT JOIN @T2_Classes ON T2_Customer_id = T1_Customer_id AND T2_Status != 'Fail' LEFT JOIN @T3_ClassTypes ON T3_ClassType_id = T2_ClassType_id AND T3_ClassType != 'PST'尝试结果和预期结果:(T2_ClassName 缩写)
第一次尝试
T1_Customer_id T1_FName T1_LName T2_Class_id T2_Customer_id T2_ClassType_id T2_ClassName T2_Status T3_ClassType_id T3_ClassType -------------- --------- --------- ------------ --------------- ---------------- ------------- ---------- ---------------- ------------ 1 John Darwin 1 1 1 EMD v1 Pass 1 EMD 1 John Darwin 2 1 2 EMDI Pass 2 EMD-I 2 Jane Doe 4 2 1 EMD v1 Pass 1 EMD第二次尝试
T1_Customer_id T1_FName T1_LName T2_Class_id T2_Customer_id T2_ClassType_id T2_ClassName T2_Status T3_ClassType_id T3_ClassType -------------- --------- --------- ------------ --------------- ---------------- ------------- ---------- ---------------- ------------ 1 John Darwin 1 1 1 EMD v1... Pass 1 EMD 1 John Darwin 2 1 2 EMDI... Pass 2 EMD-I 2 Jane Doe 3 2 3 PST... Pass null null 2 Jane Doe 4 2 1 EMD v1... Pass 1 EMD 3 Bobby Black null null null null null null null期望的结果
T1_Customer_id T1_FName T1_LName T2_Class_id T2_Customer_id T2_ClassType_id T2_ClassName T2_Status T3_ClassType_id T3_ClassType -------------- --------- --------- ------------ --------------- ---------------- ------------- ---------- ---------------- ------------ 1 John Darwin 1 1 1 EMD v1 Pass 1 EMD 1 John Darwin 2 1 2 EMDI Pass 2 EMD-I 2 Jane Doe 4 2 1 EMD v1 Pass 1 EMD 3 Bobby Black null null null null null null null
【问题讨论】:
-
请添加几行示例数据和预期结果。 T2 上的左连接不会确保 T1 中的所有行都将出现在结果集中。
-
mysql 不是 sql-server;请只标记您的实际数据库
-
@ysth - 对不起。有人建议添加标签“mysql”,我认为这是 sql-server 的代码类型。我会删除它。
-
@TheImpaler - 我在我的 DECLARES 中提供了我尝试的示例数据,并解释了我在引用该数据时的要求......?
-
您的预期输出是什么?
标签: sql sql-server join left-join sql-server-2016