相关疑难解决方法(0)

使用LEFT JOIN查询不返回计数为0的行

我试图让以下内容为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)

sql postgresql count left-join

31
推荐指数
2
解决办法
3万
查看次数

SQL查询的执行顺序

我对此查询的执行顺序感到困惑,请解释一下.我很困惑何时应用连接,调用函数,随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)

sql-server

27
推荐指数
4
解决办法
6万
查看次数

更详细地解释JOIN与LEFT JOIN和WHERE条件性能建议

这个候选答案中,断言它JOINLEFT JOIN在涉及某些WHERE子句的某些情况下更好,因为它不会混淆查询规划器并且不是"毫无意义".断言/假设是对任何人都应该是显而易见的.

请进一步解释或提供进一步阅读的链接.

sql postgresql join left-join where

12
推荐指数
2
解决办法
2万
查看次数

左外连接不会返回左表中的所有行?

我试图使用以下查询每天打开页面数.

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 sql date

11
推荐指数
2
解决办法
2万
查看次数

为什么MySQL的LEFT JOIN在使用WHERE子句时返回"NULL"记录?

今天我尝试了一些更复杂的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 …

php mysql sql left-join where

9
推荐指数
2
解决办法
2万
查看次数

SQL INNER JOIN vs LEFT JOIN with a WHERE

我试图更直观地掌握 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)

我将其读作“向我显示HeaderTableDetailTable表中在HeaderTable.IDDetailTable.ParentID字段中具有匹配值的所有记录。” 与以下相同:

SELECT * FROM HeaderTable
LEFT JOIN DetailTable 
ON    HeaderTable.ID = DetailTable.ParentID
WHERE HeaderTable.ID = DetailTable.ParentID
Run Code Online (Sandbox Code Playgroud)

这也是我读作“让我看看表中的所有记录HeaderTableDetailTable其中的价值HeaderTable.ID相同的值DetailTable.ParentID。”

这些会返回相同的结果集吗?我更多地询问逻辑是否相同,而不是一个比另一个更有效。

如果我可能会问,请不要用任何维恩图来回答,因为这些似乎并没有准确地描述连接的逻辑。

sql-server join inner-join left-join

6
推荐指数
1
解决办法
3527
查看次数

为什么我的t-sql离开加入不起作用?

你可以运行它并告诉我为什么结果集只有两行.它应该有三个,看起来像这样......

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)

sql sql-server

6
推荐指数
1
解决办法
4495
查看次数

Postgres Left加入条件

我需要在两个表中加入一个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)

mysql sql postgresql date-range left-join

6
推荐指数
1
解决办法
5517
查看次数

LEFT JOIN根据WHERE条件的位置给出不同的数据集

请参阅以下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)

sql t-sql sql-server sql-server-2008 sql-server-2012

5
推荐指数
2
解决办法
602
查看次数

如果 PostgreSQL 中没有行匹配,如何选择 null?

我有以下查询:

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)

只要至少有一个匹配,就会返回一行,但是如果没有匹配,则不会有任何行。

如果没有匹配,是否可以返回一行空值?

sql postgresql null row

3
推荐指数
1
解决办法
6230
查看次数

当不存在行时,LEFT JOIN 不返回 null

我正在使用 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 sql-server join left-join

-1
推荐指数
1
解决办法
202
查看次数