我有以下查询。我需要它包含来自'yahrzeit'和tbldecedent表的所有记录,而匹配的那些(dupes)应该只列出一次。
"All versions "
答案 0 :(得分:1)
连接后的子句属于何处。 由于我们使用外连接,我们必须确保匹配记录的where子句标准被移动到连接或外连接被否定。
在mySQL中模拟一个完整的外连接我们简单地做一个左右连接与一个联合ALL(联合做一个独特的删除重复)
SELECT tbldecedent.Name, tbldecedent.EngDate, Count(*) as Cnt
FROM yahrzeit
LEFT JOIN tbldecedent
ON CONCAT( yahrzeit.firstName, ' ', yahrzeit.middleName, ' ', yahrzeit.lastName ) = tbldecedent.Name
AND DATE_FORMAT( CONCAT( yahrzeit.gregorianYear, '-', yahrzeit.gregorianMonthNum, '-', yahrzeit.gregorianDay ) , '%Y-%m-%d' ) = tbldecedent.EngDate
WHERE yahrzeit.confirmed = 1
AND tblDecedent.name is null -- add this to only show no matches.
GROUP BY tbldecedent.Name, tbldecedent.EngDate
UNION ALL
SELECT tbldecedent.Name, tbldecedent.EngDate, Count(*) as cnt
FROM yahrzeit
RIGHT JOIN tbldecedent
ON CONCAT( yahrzeit.firstName, ' ', yahrzeit.middleName, ' ', yahrzeit.lastName ) = tbldecedent.Name
AND DATE_FORMAT( CONCAT( yahrzeit.gregorianYear, '-', yahrzeit.gregorianMonthNum, '-', yahrzeit.gregorianDay ) , '%Y-%m-%d' ) = tbldecedent.EngDate
AND yhrzeit.confirmed = 1
WHERE CONCAT( yahrzeit.firstName, ' ', yahrzeit.middleName, ' ', yahrzeit.lastName ) is null -- add this to only show no matches.
GROUP BY tbldecedent.Name, tbldecedent.EngDate
为了更好地理解联接,我建议:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/维恩图方法是一个很好的方法。
最后,我不推荐只包含两个字段的select *, count()
组。选择应仅包括加上组中的值
聚合或常数。当前版本的MySQL不会让你在不改变全局设置的情况下逃脱这一点,而其他引擎根本不支持这种方法。 MySQL扩展了组以允许它;但是对于未在组中列出的列,结果可能是意外的。有关详情,请参阅文档:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html