我试图让以下内容为PostgreSQL中使用左连接的每个组织返回一个计数,但我无法弄清楚为什么它不起作用:
select o.name as organisation_name,
coalesce(COUNT(exam_items.id)) as total_used
from organisations o
left join exam_items e on o.id = e.organisation_id
where e.item_template_id = #{sanitize(item_template_id)}
and e.used = true
group by o.name
order by o.name
Run Code Online (Sandbox Code Playgroud)
使用coalesce似乎不起作用.我的智慧结束了!任何帮助肯定会受到赞赏!
为了澄清什么不起作用,目前查询只返回计数大于0的组织的值.我希望它为每个组织返回一行,而不管计数如何.
表定义:
TABLE exam_items
id serial NOT NULL
exam_id integer
item_version_id integer
used boolean DEFAULT false
question_identifier character varying(255)
organisation_id integer
created_at timestamp without time zone NOT NULL
updated_at timestamp without time zone NOT NULL
item_template_id integer
stem_id integer
CONSTRAINT exam_items_pkey PRIMARY …Run Code Online (Sandbox Code Playgroud) 我对此查询的执行顺序感到困惑,请解释一下.我很困惑何时应用连接,调用函数,随Case添加新列以及添加序列号时.请解释所有这些的执行顺序.
select Row_number() OVER(ORDER BY (SELECT 1)) AS 'Serial Number',
EP.FirstName,Ep.LastName,[dbo].[GetBookingRoleName](ES.UserId,EP.BookingRole) as RoleName,
(select top 1 convert(varchar(10),eventDate,103)from [3rdi_EventDates] where EventId=13) as EventDate,
(CASE [dbo].[GetBookingRoleName](ES.UserId,EP.BookingRole)
WHEN '90 Day Client' THEN 'DC'
WHEN 'Association Client' THEN 'DC'
WHEN 'Autism Whisperer' THEN 'DC'
WHEN 'CampII' THEN 'AD'
WHEN 'Captain' THEN 'AD'
WHEN 'Chiropractic Assistant' THEN 'AD'
WHEN 'Coaches' THEN 'AD'
END) as Category from [3rdi_EventParticipants] as EP
inner join [3rdi_EventSignup] as ES on EP.SignUpId = ES.SignUpId
where EP.EventId = 13
and userid in …Run Code Online (Sandbox Code Playgroud) 在这个候选答案中,断言它JOIN比LEFT JOIN在涉及某些WHERE子句的某些情况下更好,因为它不会混淆查询规划器并且不是"毫无意义".断言/假设是对任何人都应该是显而易见的.
请进一步解释或提供进一步阅读的链接.
我试图使用以下查询每天打开页面数.
SELECT day.days, COUNT(*) as opens
FROM day
LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date))
WHERE tracking.open_id = 10
GROUP BY day.days
Run Code Online (Sandbox Code Playgroud)
我得到它的输出是这样的:
days opens
1 9
9 2
Run Code Online (Sandbox Code Playgroud)
问题是,在我的日历表中,我有一个包含数字1到30的列来表示一个月中的日期.我做了一个左外连接,我期待在天柱上显示所有日子!
但我的问题是这样做,为什么会这样呢?
谢谢大家的帮助.
今天我尝试了一些更复杂的MySQL查询,我注意到MySQL的LEFT JOIN不能与WHERE子句一起使用.我的意思是,它确实会返回一些记录,但它不会返回右侧为空的记录.
例如,假设我们需要表格:
albums ; albums_rap id artist title tracks ; id artist title rank ---- -------- ---------- --------------- ; ---- --------- ----- -------------- 1 John Doe Mix CD 20 ; 3 Mark CD #7 15 2 Mark CD #7 35 ;
当我运行此查询时:
SELECT
t1.artist as artist,
t1.title as title,
t1.tracks as tracks,
t2.rank as rank,
FROM
albums as t1
LEFT JOIN
albums_rap as t2
ON
t1.artist LIKE t2.artist
AND
t1.title LIKE t2.title
WHERE
t2.rank != 17
Run Code Online (Sandbox Code Playgroud)
我明白了:
artist title …
我试图更直观地掌握 SQL 连接。就在昨天,我了解了如何将 RIGHT JOIN 重写为 LEFT JOIN(通过翻转表格的顺序),这帮助我更好地理解了这两个连接的工作方式。
但是,现在我想知道是否可以将 INNER JOIN 重写为带有 WHERE 条件的 LEFT JOIN——这意味着它们的逻辑可能是等效的(“逻辑”不是指执行计划,而是将描述预期的结果集)。
喜欢:
SELECT * FROM HeaderTable
INNER JOIN DetailTable
ON HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)
我将其读作“向我显示HeaderTable和DetailTable表中在HeaderTable.ID和DetailTable.ParentID字段中具有匹配值的所有记录。” 与以下相同:
SELECT * FROM HeaderTable
LEFT JOIN DetailTable
ON HeaderTable.ID = DetailTable.ParentID
WHERE HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)
这也是我读作“让我看看表中的所有记录HeaderTable和DetailTable其中的价值HeaderTable.ID相同的值DetailTable.ParentID。”
这些会返回相同的结果集吗?我更多地询问逻辑是否相同,而不是一个比另一个更有效。
如果我可能会问,请不要用任何维恩图来回答,因为这些似乎并没有准确地描述连接的逻辑。
你可以运行它并告诉我为什么结果集只有两行.它应该有三个,看起来像这样......
appId stepId section start
101 1 Section 1 2016-01-03 00:00:00.000
101 2 Section 2 2016-01-03 00:00:00.000
101 10 Section 3 NULL
Run Code Online (Sandbox Code Playgroud)
这是sql,因此您可以将其粘贴到查询工具中
create table #appSteps(stepId decimal, section nvarchar(50))
insert into #appSteps (stepId, section) values (1, 'Section 1')
insert into #appSteps (stepId, section) values (2, 'Section 2')
insert into #appSteps (stepId, section) values (3, null)
insert into #appSteps (stepId, section) values (4, null)
insert into #appSteps (stepId, section) values (10, 'Section 3')
create table #appProgress(stepId decimal, appId int, start datetime) …Run Code Online (Sandbox Code Playgroud) 我需要在两个表中加入一个where条件:
time_table
id rid start_date end_date
1 2 2017-07-01 00:00:00 2018-11-01 00:00:00
2 5 2017-01-01 00:00:00 2017-06-01 00:00:00
3 2 2018-07-01 00:00:00 2020-11-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
record_table
id name date
1 record1 2017-10-01 00:00:00
2 record2 2017-02-01 00:00:00
3 record3 2017-10-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
我需要获取在给定日期范围内出现的所有记录.在上面的例子中,我需要那些rid = 2仅在范围内的记录.因此,上述查询的输出必须是:
1 record1 2017-10-01 00:00:00
3 record3 2017-10-01 00:00:00
Run Code Online (Sandbox Code Playgroud) 请参阅以下3个计数,只是为了简要介绍一下表格数据.所有skCitizen的[dbo].[LUEducation]存在于[dbo].[LUCitizen]
SELECT COUNT(*) FROM [dbo].[LUCitizen] --115000 ROWS
SELECT COUNT(*) FROM [dbo].[LUEducation] --201846 ROWS
SELECT COUNT(*) --212695 ROWS
FROM [dbo].[LUCitizen] C
LEFT JOIN [dbo].[LUEducation] E
ON C.skCitizen = E.skCitizen
SELECT COUNT(*) FROM [dbo].[LUEducation] WHERE skSchool = 24417 --4 ROWS
Run Code Online (Sandbox Code Playgroud)
请参阅以下2个查询,
SELECT C.skCitizen,E.skCitizen
FROM [dbo].[LUCitizen] C
LEFT JOIN [dbo].[LUEducation] E
ON C.skCitizen = E.skCitizen
WHERE E.skSchool = 24417
--4 ROWS
SELECT C.skCitizen,E.skCitizen
FROM [dbo].[LUCitizen] C
LEFT JOIN (SELECT * FROM [dbo].[LUEducation] WHERE skSchool = 24417) E
ON …Run Code Online (Sandbox Code Playgroud) 我有以下查询:
SELECT c.customer_id
FROM order o
JOIN customer c USING (customer_id)
WHERE c.time >= '2021-01-01 10:00:00' AND c.time < '2021-01-01 11:00:00'
AND (0 IN (22) OR o.product_id IN (22))
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
只要至少有一个匹配,就会返回一行,但是如果没有匹配,则不会有任何行。
如果没有匹配,是否可以返回一行空值?
我正在使用 2 个表:1 个表处理一组人的基本人口统计数据,1 个表处理已完成的活动。我需要做的是从人口统计表中提取所有结果(所有人),然后显示在给定时间范围内完成某种类型活动的任何人的活动信息(给定的人也可能完成了多项活动)在那个时间范围内)。如果某人尚未完成任何指定的活动,我仍然希望他们在列表中可见。我希望结果如下所示:
PersonID Name DateOfBirth ActivityDate ActivityType
---------------------------------------------------------------------
1001 John Smith 01/01/1990 10/18/2022 Painting
1002 Jane Doe 12/31/1980 NULL NULL
1003 Bob Brown 07/04/1995 10/17/2022 Reading
1003 Bob Brown 07/04/1995 09/09/2022 Painting
1004 Mike Jones 03/24/1984 NULL NULL
1005 Ann Green 11/30/1988 08/29/2022 Writing
1006 Sally Black 05/15/1999 NULL NULL
Run Code Online (Sandbox Code Playgroud)
看起来这应该是LEFT JOIN两个表之间非常简单的查询:
SELECT DISTINCT
d.PersonID,
d.Name
d.DateOfBirth,
a.ActivityDate
a.ActivityType
FROM Demographics d
LEFT JOIN Activity a ON d.PersonID = a.PersonID
WHERE ActivityDate BETWEEN DATEADD(yy,-1,GETDATE()) AND …Run Code Online (Sandbox Code Playgroud) sql ×9
left-join ×6
sql-server ×5
postgresql ×4
join ×3
mysql ×3
where ×2
count ×1
date ×1
date-range ×1
inner-join ×1
null ×1
php ×1
row ×1
t-sql ×1