我有一个复杂的查询,我一直在努力,最近我更改了其中一个列,以便有多个条目引用相同的外键。
是否有一种简单的方法可以使得如果有一个或多个具有相同外键的条目返回值为“true”(或其他某个值)而不是n个单独的行?
例如
我想要这个:
id | Date
1 | true
2 | NULL
而不是这个(现在发生了什么):
id | Date
1 | feb 4
1 | feb 5
1 | feb 6
2 | NULL
2 | feb 5
如果没有值我只想为日期
EDIT 我忘记了同一主键(id#2)同时具有值和空值的情况。在这种情况下,我需要能够返回Null。如果有任何空值,则它应返回null。 修改
我尝试过按功能分组,但无法接近我想要完成的任务
这是我的查询的简化版本,因为它已经存在,不希望将此问题与额外的列混淆。
SELECT distinct job, DATE_FORMAT( scan_date, '%M %e, %Y, %l:%i%p' ) AS Scanning
FROM Scan, job
WHERE Scan.job_job = job
答案 0 :(得分:1)
检查是否存在任何扫描记录,而不是直接加入Scan表:
SELECT distinct job, exists(select 1 from Scan where Scan.job_job = job) AS Scanning
FROM job;
如果存在扫描记录,则返回1,否则返回0。如果你真的想使用“true”和NULL,你可以将exists包装在IF()中。
答案 1 :(得分:0)
我还没有测试过,但试一试:
SELECT DISTINCT j.job, CASE WHEN scan_date IS NULL THEN null
ELSE 'true'
END
FROM Scan, job
WHERE Scan.job_job = job
答案 2 :(得分:0)
要返回true或null,可以在select子句中使用CASE WHEN语句。有关详细信息,请参阅 - http://msdn.microsoft.com/en-us/library/ms181765.aspx。
答案 3 :(得分:0)
SELECT job, COUNT(scan_date) != 0 AS Scanning
FROM job
LEFT JOIN scan ON job_job = job
GROUP BY job
答案 4 :(得分:0)
这是另一种解决方案:
SELECT j.job, IF(COUNT(s.scan_date) > 0, 'true', NULL) AS Scanning
FROM job j
LEFT JOIN Scan s
ON j.job = s.job_job
GROUP BY j.job