标签: join

当连接表中的记录不存在时 MySQL 连接

当连接表中的记录不存在时,我如何连接两个表。我尝试过这样的事情:

SELECT 
    Confessions.ID, Confessions.WriteTitle, Confessions.WriteArea,
    Confessions.POST_DATE, Votes.Type
FROM Confessions LEFT OUTER JOIN Votes ON Confessions.ID = Votes.PostID 
WHERE ForUser = :ForUser AND Status = :Status AND Votes.IP_Check = :IP_Check
Run Code Online (Sandbox Code Playgroud)

但是当来自带有 PostID 的投票记录(如 Confessions 中的 ID)不存在时,MySQL 会返回此记录的空结果。有没有其他办法?

mysql join

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

同一列上的多个 WHERE 条件 =val1 但不 =val2 或 val3

我正在尝试过滤具有非唯一事务 ID 的表,该表已连接到 1 个公共列上的产品表。过滤器需要如下:

equal to :group1 AND
NOT equal to :group2 AND
NOT equal to :group3
Run Code Online (Sandbox Code Playgroud)

我最初从以下查询开始,但没有AND rk_group <> ____条件。

SELECT COUNT(DISTINCT txn_id)
                    FROM 1_txns
                    INNER JOIN 2_products USING (sku)
                    WHERE rk_group = :group1
                    AND rk_group <> :group2
                    AND rk_group <> :group3
                    ;
Run Code Online (Sandbox Code Playgroud)

我也试过

SELECT COUNT(DISTINCT txn_id)
                    FROM 1_txns
                    INNER JOIN 2_products USING (sku)
                    WHERE rk_group NOT IN ( :group2, :group3)
                    ;
Run Code Online (Sandbox Code Playgroud)

我还尝试了多种连接和 IN() 和 NOT IN() 的组合,它仍然返回所有团队 ID,包括那些存在 NOT 组的团队 ID。

有人可以指出我正确的方向吗?

与查询相关的架构信息:

table 1_txns …
Run Code Online (Sandbox Code Playgroud)

mysql join condition where

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

Hash Join 如何与除等式运算符以外的关系运算符一起使用?

我一直在阅读有关 Hash Join 以及它在物理层面上是如何工作的。但是,有些事情我不明白(因为我缺乏知识)。

这是我找到的Hash Join算法;

for each row R1 in the build table
    begin
        calculate hash value on R1 join key(s)
        insert R1 into the appropriate hash bucket
    end
for each row R2 in the probe table
    begin
        calculate hash value on R2 join key(s)
        for each row R1 in the corresponding hash bucket
            if R1 joins with R2
                return (R1, R2)
    end
Run Code Online (Sandbox Code Playgroud)

这对于诸如"TABLE1.NAME == TABLE2.NAME"等的连接条件似乎是足够的。但是,当连接条件为"TABLE1.NAME == TABLE2.NAME" && "TABLE1.AGE > TABLE2.AGE".

我只是无法找到并理解他们如何生成或比较需要相等运算符和其他一些关系运算符(例如大于等)的哈希值。

join physical-design hashing

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

不同频率表之间的连接

假设我有两个表DailyTableQuarterlyTable,每个表都有 3 列:IDDateValue

顾名思义,DailyTable存储数据的频率是每天,而QuarterlyTable存储数据的频率是季度。

如何连接这两个表,以便根据IDDate 将每个表中的最新(时间点)数据结合起来获得每日结果?

每日表

    ID   |  Date   |    Value  |
---------+---------+------------
    1    |1/1/2010 |     10    |
    1    |1/2/2010 |     15    |
              ... 
    1    |3/1/2010 |     20    |
              ... 
    1    |4/1/2010 |     30    |
Run Code Online (Sandbox Code Playgroud)

季表

    ID   |  Date   |    Value  |
---------+---------+------------
    1    |1/1/2010 |   1000    |
    1    |4/1/2010 |   2000    |
              ... 
Run Code Online (Sandbox Code Playgroud)

结果

    ID   |  Date   |    Value  | …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 join sql-server greatest-n-per-group

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

估计自然连接的结果大小

我有以下表格

R1( A , B, C) 有 1.000 行

R2( C , D, E) 有 1.500 行

R3( E , F) 750 行

其中粗体字母表示主键。

我需要估计自然连接 R1 |x| 的行数 R2 |x| R3。

我的教科书提出了以下解决方案

无论我们以哪种方式连接 R1、R2 和 R3,它们的自然连接都是相同的(连接既是关联又是可交换的)。可以使用先加入 R1 和 R2,然后将结果与 R3 连接的策略来估计大小。将 R1 与 R2 连接将产生最多 1.000 行的表,因为 C 是 R2 的键。同样,将该结果与 R3 连接将产生最多 1.000 行的表,因为 E 是 R3 的键。因此,最终关系最多有 1.000 行!

我原以为最终关系最多有 750 行,因为 R3 只有 750 行。

教科书的解决方案不正确,还是我遗漏了什么?

join relational-theory

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

使用 Group By 时,完全外部联接显示 NULL

我有 4 个子查询,每个子查询都按“组名”分组。尝试将每个子查询作为一个列,全部按“组名”分组。这是查询:

select  
    coalesce(co.group_name, requests.group_Name, incidents.group_Name, problems.group_Name) as 'SD Groups'
    , isnull(co.co, '') as 'CO'
    , isnull(incidents.incidents, '' ) as 'Inc'
    , isnull(problems.problems, '') as 'Prob'
    , isnull(requests.requests, '') as 'Rqst'
from
    (
    select 
        groups.last_name AS Group_Name   
        ,count(chg_ref_num)  AS 'CO'
    from chg
    left join   ca_contact groups 
        on chg.group_id = groups.contact_uuid 
    left join   ca_contact assignee 
        on chg.assignee = assignee.contact_uuid 
    left join   ca_company cc 
        on  assignee.company_uuid = cc.company_uuid                       
    where   
        groups.last_name in ('8197 Qlikview Support', '8202 OBIEE-BIP'
                        , '8205 BI SAS', '8206 …
Run Code Online (Sandbox Code Playgroud)

null join sql-server group-by

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

如何加入空值?

此代码仅返回具有评级的帖子。如果帖子没有评级,我如何获取所有具有空值的帖子?

select 
    posts.id, 
    posts.user_id, 
    posts.name, 
    posts.created_at,
    ratings.post_id,
    ratings.avg,
    ratings.count
from 
    posts
join (
    select
        post_id,
        avg(rating) as avg, 
        count(rating) as count
    from 
        ratings
    group by 
        ratings.post_id
) ratings
on ratings.post_id = posts.id
Run Code Online (Sandbox Code Playgroud)

mysql join group-by

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

逗号分隔连接(交叉连接)

我不明白这个查询是如何工作的:

1    SELECT       
2        EXTRACTVALUE(definition_xml.COLUMN_VALUE, 'SubtypeFieldInfo/DomainName') AS domain_name
3    FROM        
4        SDE.GDB_ITEMS_VW i 
5        JOIN SDE.GDB_ITEMTYPES it ON
6            i.Type = it.UUID
7            ,TABLE(XMLSEQUENCE(XMLType(Definition).Extract('/DETableInfo/Subtypes/Subtype/FieldInfos/SubtypeFieldInfo'))) definition_xml  
Run Code Online (Sandbox Code Playgroud)

第 7 行开头的逗号有什么作用?

我的猜测是编写查询的人使用了某种 SQL 简写。也许如果有人可以帮助重新格式化“初学者 SQL”中的查询,它可能会有所帮助。

oracle join syntax

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

解释这个内部连接和自然连接之间的输出差异

NATURAL JOIN 是一种 JOIN 操作,它根据要连接的两个表中的公共列为您创建隐式连接子句。NATURAL JOIN 可以是 INNER 连接、LEFT OUTER 连接或 RIGHT OUTER 连接。默认为内部联接。来源

因此,如果两个表都有一个公共列,自然连接可以是实现内部连接的一种简写方式。

考虑下表:

SELECT * FROM t1;
/*
        ID PLANET  
---------- --------
         1 jupiter 
         2 earth 
*/
Run Code Online (Sandbox Code Playgroud)

我们将表加入到自身中:

SELECT first.id, first.planet FROM t1 first INNER JOIN t1 second ON first.id=second.id;
/*
        ID PLANET  
---------- --------
         1 jupiter 
         2 earth   
*/
Run Code Online (Sandbox Code Playgroud)

尝试使用自然连接符号做同样的事情:

SELECT id, planet FROM t1 NATURAL JOIN t1;
/*
        ID PLANET  
---------- --------
         1 jupiter 
         1 jupiter 
         2 earth   
         2 earth   
*/
Run Code Online (Sandbox Code Playgroud)

鉴于这里的自然连接是使用内部连接实现的,为什么会有多行?

更新:

使用表别名运行相同的连接有不同的输出: …

oracle join

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

加入是否导致其他列数据发生变化?

我会说,我是比较新的数据库和SQL,我试图做的除了率先ViewSQL Server这之前的同事创建的。

我正在尝试加入Customer_Snacks表格,以便我可以获得Snack Quantity每个客户的订单。我遇到的问题是,当我做一个LEFT OUTER JOIN,据我所知,应该工作时,其他一些列数据发生了巨大的变化。

我设法通过使用子查询使其按照我希望的方式工作,但速度非常慢。运行查询需要一分钟多的时间,作为回报,调用该视图的应用程序超时。

这是我目前有效的(我知道,它很乱):

SELECT
    cl.CustomerID,
    cl.FirstName + ' ' + c.LastName as CustomerDisplay,
    cl.InvoiceID,
    cl.MealPlanID,
    mp.DeliveryDate1 as DeliveryDate,
    SUM(CASE WHEN cll.Name = 'Meal' THEN cll.Quantity ELSE 0 END) as RegularQuantity,
    SUM(CASE WHEN cll.Name = 'Meal' THEN cll.Quantity * Amount ELSE 0 END) as RegularTotal,
    SUM(CASE WHEN cll.Name = 'EXTRAPROTEINMEAL' THEN cll.Quantity ELSE 0 END) as ProteinQuantity,
    SUM(CASE WHEN cll.Name = 'EXTRAPROTEINMEAL' THEN cll.Quantity * Amount …
Run Code Online (Sandbox Code Playgroud)

join sql-server subquery

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