SELECT DISTINCT
kol_table.KolID, kol_table.MDMID, kol_table.First_Name, kol_table.Last_Name, kol_table.Mail, kol_table.Address,
kol_table.City, kol_table.State, kol_table.Zip, profile_status_master_table.ProfleStatus,
degree_master_table.Degree, speciality_master_table.SpecialityName, images.Image_Link
FROM
kol_table, degree_master_table, kol_degree_map_table,
speciality_master_table, kol_speciality_map_table,
profile_status_master_table, images
WHERE (kol_table.kolID = kol_degree_map_table.KOLID and
kol_degree_map_table.DegreeID = degree_master_table.DegreeID and kol_table.kolID = KOL_ID)
AND (kol_table.kolID = kol_speciality_map_table.kolID and
kol_speciality_map_table.SpecialtyID = speciality_master_table.SpecialityID )
AND (kol_table.Profile_Status = profile_status_master_table.ProfileStatusID)
AND (kol_table.mdmID = images.MDMID);我在这个kol_degree_map_table.DegreeID中有这个代码,我有id,它是从degree_master_table.DegreeID引用的,我在kol_degree_map_table中也有一些null值,这是我在选择数据时想要包含的,但是我不知道如何。有人能帮我解决这个问题吗?
发布于 2022-08-20 16:04:20
下面是使用适当的标准SQL语法重写的OPs查询。正如其他人所指出的,绝对不要使用这些逗号联接编写查询。我只发现了几个使用逗号联接有用的例子,但这个答案并不是关于这个的。阅读这帖子,了解我们为什么不使用逗号联接编写查询的更多信息。这将帮助您开始编写易于阅读的更好的查询。当使用标准语法时,您可以在WHERE子句中区分连接与查询过滤器是什么。
重写查询之后,很容易看到有零个过滤器,而WHERE子句中OP拥有的每个条件都是实际的联接条件,因此很容易重写。在WHERE条款中没有过滤器。最后,每个表现在都有一个别名,使其更易于阅读。
SELECT
kt.KolID, kt.MDMID, kt.First_Name, kt.Last_Name, kt.Mail, kt.Address,
kt.City, kt.State, kt.Zip, psmt.ProfleStatus,
dmt.Degree, smt.SpecialityName, i.Image_Link
FROM
kol_table kt
JOIN kol_degree_map_table mp ON mp.kolid = kt.kolid
JOIN kol_speciality_map_table ksmt ON ksmt.kolID = kt.kolID
JOIN degree_master_table dmt ON dmt.DegreeID = mp.DegreeID
JOIN speciality_master_table smt ON smt.SpecialityID = ksmt.SpecialtyID
JOIN profile_status_master_table psmt ON psmt.ProfileStatusID = kt.Profile_Statua
JOIN images i ON i.MDMID = kt.mdmID
--WHERE
--(
--kt.kolID = mp.KOLID AND -- Moved to a JOIN Condition
-- mp.DegreeID = dmt.DegreeID AND -- Moved to a JOIN Condition
-- kt.kolID = KOL_ID -- This field doesn't have a table. What table does KOL_ID in this condition come from???
--) AND
--(
--kt.kolID = ksmt.kolID -- Moved to a JOIN Condition AND
--ksmt.SpecialtyID = smt.SpecialityID -- Moved to a JOIN Condition
--) AND
-- (kt.Profile_Status = psmt.ProfileStatusID) AND -- Moved to a JOIN Condition
-- (kt.mdmID = i.MDMID) -- Moved to a JOIN Condition
;我在原始查询中发现了一个问题,即我不知道其中一个原始条件所指的是哪个表,我已经在上面的查询中看到的注释中对这一行做了说明。kt.kolID = KOL_ID
OP最初是问他们如何才能让NULLs离开kol_degree_map_table。这个表基本上是连接链中的第二个表,所以如果没有记录从kol_table绑定到这个表,我们也会丢失我们的记录-- degree_master_table,因为它也加入了kol_degree_map_table。如果OP确实希望仍然看到没有连接到kol_table的kol_degree_map_table记录,那么我们需要离开JOIN,并将一个左连接添加到任何连接到这个表的表中。
下面的新版本与左联接一起添加,尽我所能回答操作问题。
SELECT
kt.KolID, kt.MDMID, kt.First_Name, kt.Last_Name, kt.Mail, kt.Address,
kt.City, kt.State, kt.Zip, psmt.ProfleStatus,
dmt.Degree, smt.SpecialityName, i.Image_Link
FROM
kol_table kt
LEFT JOIN kol_degree_map_table mp ON mp.kolid = kt.kolid
LEFT JOIN kol_speciality_map_table ksmt ON ksmt.kolID = kt.kolID
LEFT JOIN degree_master_table dmt ON dmt.DegreeID = mp.DegreeID
LEFT JOIN speciality_master_table smt ON smt.SpecialityID = ksmt.SpecialtyID
LEFT JOIN profile_status_master_table psmt ON psmt.ProfileStatusID = kt.Profile_Statua
LEFT JOIN images i ON i.MDMID = kt.mdmIDhttps://stackoverflow.com/questions/73427289
复制相似问题