标签: join

Postgres RIGHT JOIN 与自定义数组

我正在使用 Postgres 9.1 并希望得到一些没有数据的空白结果。我的查询如下所示:

SELECT institution_id FROM ... WHERE institution_id IN (1, 3, 4, 5, 7, 9)
Run Code Online (Sandbox Code Playgroud)

... 对这个问题并不重要,重要的是它返回一个包含数组中机构 ID 的结果 (1, 3, 4, 5, 7, 9) 并且它包括那些没有数据的机构。以下是当前输出的示例:

days    treatments    institution_id
266    6996    4
265    5310    1
267    3361    5
260    2809    3
264    5249    7
Run Code Online (Sandbox Code Playgroud)

我想要的输出示例是:

days    treatments    institution_id
266    6996    4
265    5310    1
267    3361    5
260    2809    3
264    5249    7
               9
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过使用以下查询来实现这一点:

SELECT *
FROM (
       SELECT institution_id
       FROM ... 
       WHERE institution_id IN (1, 3, …
Run Code Online (Sandbox Code Playgroud)

postgresql join

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

使用 JOIN 有效地更新表

我有一张表,其中包含家庭的详细信息,而另一个表则包含与这些家庭相关的所有人员的详细信息。对于家庭表,我使用其中的两列定义了一个主键 - [tempId,n]。对于 person 表,我有一个使用其 3 列定义的主键[tempId,n,sporder]

使用主键上的聚集索引所指示的排序,我为每个家庭[HHID]和每个人的[PERID]记录生成了一个唯一 ID (下面的代码片段用于生成 PERID]:

 ALTER TABLE dbo.persons
 ADD PERID INT IDENTITY
 CONSTRAINT [UQ dbo.persons HHID] UNIQUE;
Run Code Online (Sandbox Code Playgroud)

现在,我的下一步是将每个人与相应的家庭相关联,即;将 a 映射[PERID]到 a [HHID]。两个表之间的人行横道基于两列[tempId,n]。为此,我有以下内部连接语句。

UPDATE t1
  SET t1.HHID = t2.HHID
  FROM dbo.persons AS t1
  INNER JOIN dbo.households AS t2
  ON t1.tempId = t2.tempId AND t1.n = t2.n;
Run Code Online (Sandbox Code Playgroud)

我总共有1928783个户籍记录和5239842个人记录。执行时间目前非常高。

现在,我的问题:

  1. 是否可以进一步优化此查询?更一般地说,优化连接查询的拇指规则是什么?
  2. 是否有另一个查询构造可以以更好的执行时间实现我想要的结果?

我已将SQL Server 2008 为整个脚本生成的执行计划上传到 SQLPerformance.com

join sql-server optimization execution-plan

8
推荐指数
1
解决办法
1万
查看次数

左外连接不返回分组查询中的所有行

我正在尝试查询所有用户以查找上个月的订单价格。我在 PostgreSQL 上做这个。这是一个玩具数据库来显示我的问题:我有一张people桌子和一张orders桌子。我试图找到上个月所有人的订单总和。

这是我的数据:

select * from people;
 id |     name     
----+--------------
  1 | bobby lee
  2 | greg grouper
  3 | Hilldawg Ca
(3 rows)

select * from orders;
 id | person_id |    date    | price 
----+-----------+------------+-------
  1 |         3 | 2014-08-20 |  3.50
  2 |         3 | 2014-09-20 |  6.00
  3 |         3 | 2014-09-10 |  7.00
  4 |         2 | 2014-09-10 |  7.00
  5 |         2 | 2014-08-10 |  2.50
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试编写的查询:

SELECT p.id, …
Run Code Online (Sandbox Code Playgroud)

postgresql join sum

8
推荐指数
1
解决办法
8313
查看次数

我可以跳过连接中的中间表吗?

我写了这个查询:

SELECT 
    "BD - Utilizadores".Utilizador, 
    "BD - Utilizadores"."Palavra passe", 
    "BD - Áreas".área 
FROM "BD - Utilizadores" 
INNER JOIN "BD - Permissões" 
    on "BD - Utilizadores".id = "BD - Permissões"."user_id" 
Join "BD - Áreas" 
    on "BD - Permissões".area_id = "BD - Áreas".id
Run Code Online (Sandbox Code Playgroud)

我想将表“bd - utilizadores”中的数据与“bd - áreas”连接起来。由于他们没有直接联系,我不得不使用“中间人”,即“bd - Permissões”。这是图表:

链接表

我的主要问题是,有没有其他方法可以做到这一点并获得相同的结果?

join sql-server

7
推荐指数
3
解决办法
2017
查看次数

帮助查找没有谓词的连接

很像swasheck 的一个相关问题,我有一个历史上曾遭受性能问题的查询。我正在查看 SSMS 上的查询计划并注意到Nested Loops (Inner Join)警告:

无连接谓词

根据一些仓促的研究(鼓舞人心的DBABrent Ozar 的信心),看起来这个警告告诉我我的查询中有一个隐藏的笛卡尔积。我已经检查了几次我的查询,但没有看到交叉连接。这是查询:

DECLARE @UserId INT; -- Stored procedure input
DECLARE @Now DATETIME2(7) = SYSUTCDATETIME();
;WITH AggregateStepData_CTE AS -- Considering converting this CTE into an indexed view
(
    SELECT 
        [UA].[UserId] -- FK to the UserId
        , [UA].[DeviceId] -- FK to the push device's DeviceId (int)
        , SUM(ISNULL([UA].[LatestSteps], 0)) AS [Steps]
    FROM [User].[UserStatus] [UA]
        INNER JOIN [User].[CurrentConnections] [M] ON 
           [M].[Monitored] = [UA].[UserId] AND …
Run Code Online (Sandbox Code Playgroud)

performance join sql-server azure-sql-database query-performance

7
推荐指数
1
解决办法
532
查看次数

子查询无法从超级查询的连接中找到列

我在 SQL 方面遇到了一些麻烦:基本上,我试图获取一个结果集,其中包含向员工提出的所有问题的总和(按公司分组),并添加手动添加项目的“onetime_items”不同的表。

我目前有这个 SQL 语句(我使用的是 MySQL):

SELECT 
CONCAT_WS(
    ', ', count(DISTINCT CONCAT(emailaddress, '_', e.id)),
    (
        SELECT GROUP_CONCAT(items SEPARATOR '; ') as OneTimeItems
        FROM ( 
            SELECT CONCAT_WS(
                ': ', oi.item_name, SUM(oi.item_amount)
            ) items 
            FROM onetime_item oi 
            WHERE oi.company_id = e.company_id
            AND oi.date BETWEEN '2015-12-01'
            AND LAST_DAY('2015-12-01') 
            GROUP BY oi.item_name 
        ) resulta
    )
) as AllItems,
e.id,
LEFT(e.firstname, 1) as voorletter,
e.lastname
FROM question q 
LEFT JOIN employee e ON q.employee_id = e.id 
WHERE 1=1 
AND YEAR(created_at) = '2015'
AND MONTH(created_at) …
Run Code Online (Sandbox Code Playgroud)

mysql join subquery

7
推荐指数
1
解决办法
8241
查看次数

使用两个 LEFT JOIN 还是将 AND 与单个 LEFT JOIN 一起使用?

使用两个LEFT JOINs ie

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
LEFT JOIN Table2 AS t3 ON <condition2>
Run Code Online (Sandbox Code Playgroud)

这和AND在 single 中使用一样LEFT JOIN吗?IE

SELECT <some columns>
FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON <condition1>
AND <condition2>
Run Code Online (Sandbox Code Playgroud)

两者是相同的还是不同的(一般来说)?

join sql-server-2012

7
推荐指数
1
解决办法
1744
查看次数

tmp_table_size 和 max_heap_table_size MySQL 属性的经验法则

标题几乎总结了问题本身:是否有关于tmp_table_sizemax_heap_table_sizeMySQL 属性的值的经验法则?

我的性能严重下降,这是由于 MySQL 使用磁盘空间对 JOIN 结果进行文件排序造成的。

增加tmp_table_sizemax_heap_table_size向3G解决的问题,但是这更多的是一种试错的办法。

有没有更可靠的方法来计算这两个的合适值?

mysql performance join sorting

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

通过条件过滤优化昂贵的连接/子查询

这是一个关于在 Postgresql(9.5 或 9.6)中短路昂贵的 JOIN 或子查询的问题。我也有兴趣了解人们通常如何解决先检查后执行的问题。

我正在编写很多只应有条件地返回结果的查询,例如(网络)用户是否拥有记录或记录是否被修改。我试图阻止在 Postgresql 中构建昂贵的视图和多个来回查询来检查应用程序本身中的条件,因此我尝试编写首先选择正确记录并显示哪些条件失败的查询,并且只执行查看条件是否通过。

例如,这会在返回之前检查(应用程序)用户是否拥有记录:

SELECT is_owner, is_newer, json 
FROM (
     SELECT id, owner = '053bffbc-c41e-dad4-853b-ea91fc42ea18' "is_owner"
          , modified >= created "is_newer" 
     FROM datasets 
     WHERE id = '056e4eed-ee63-2add-e981-0c86b8b6a66f'
) cond
LEFT JOIN LATERAL (
     SELECT id 
     FROM datasets 
     WHERE is_owner and is_newer
) authed
    ON cond.id = authed.id
LEFT JOIN LATERAL (
     SELECT json 
     FROM view_dataset 
     WHERE id = authed.id
) dataset
    ON true;
Run Code Online (Sandbox Code Playgroud)

结果(是所有者):

is_owner | is_newer | json
t          t          {...}
Run Code Online (Sandbox Code Playgroud)

和负面结果(不是所有者):

is_owner …
Run Code Online (Sandbox Code Playgroud)

postgresql join

7
推荐指数
1
解决办法
3558
查看次数

操作包含键/值对的列

我正在通过复制的 SQL Server 数据库访问和创建来自供应商的报告。他们做了一些我一直试图解决的绝对疯狂的事情,但这个问题占据了上风。

他们有一个包含许多标准列的表。但是这个表还有一个叫做“数据”的列。该列是传统的“文本”数据类型,它包含一个巨大的(数百个)键/值对列表。每对由 CRLF 分隔,键和值由等号分隔。例子:

select myTable.[data] from myTable where tblKey = 123
Run Code Online (Sandbox Code Playgroud)

结果:

Key 1=Value 1
Key 2=Value 2
Key 3=Value 3
...
Key 500=Value 500
Run Code Online (Sandbox Code Playgroud)

我正在尝试确定将该列分解为可用数据表的最有效方法。最终目标是能够以将表键以及指定键/值作为列/字段返回的方式查询表:

tblKey | [Key 1] | [Key 3] | [Key 243]
-------|---------|---------|-----------
 123     Value 1   Value 3   Value 243
 124     Value 1   Value 3   Value 243
 125     Value 1   Value 3   Value 243
Run Code Online (Sandbox Code Playgroud)

有没有办法将该列塑造成一个视图?我无法想象一个函数会特别有效,但我确信我可以使用 string_split 或类似的东西来解析事情。有没有人以前遇到过这种暴行并找到了一种将其操纵成可用数据的好方法?

编辑以添加dbfiddle示例数据。

数据是从供应商的来源复制的,因此我无法创建新表。我可以创建视图、过程和函数。这就是我正在寻找一种体面的方式来完成的建议。

join sql-server view sql-server-2016 enterprise-edition

7
推荐指数
2
解决办法
2844
查看次数