当前位置: 首页 > 知识库问答 >
问题:

如何联接多个表并返回具有空值的结果

越骏俊
2023-03-14

我试图连接4个表,其中一个表没有所有匹配的ID,但我仍然需要显示连接的结果,甚至对于没有相应ID的行。

下面是我所说的一个例子:


    DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, ts DateTime, tbl2_id INT, price DECIMAL(4,2), tbl3_id INT, tbl4_id INT)

    INSERT INTO @Table1 VALUES(1, '2013-07-25 09:30:00', 10, 10.25, 1);
    INSERT INTO @Table1 VALUES(2, '2013-07-25 10:25:00', 20, 25.25, 1);
    INSERT INTO @Table1 VALUES(3, '2013-07-25 11:45:00', 30, 30.15, 2);
    INSERT INTO @Table1 VALUES(4, '2013-07-25 13:31:00', 40, 80.40, 2);

    DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, symbol VARCHAR(25), tbl1_id int)

    INSERT INTO @Table2 VALUES(10, 'XYZ', 1);
    INSERT INTO @Table2 VALUES(20, 'ABC', 2);
    INSERT INTO @Table2 VALUES(30, 'RST', 3);
    INSERT INTO @Table2 VALUES(40, 'EFG', 4);

    DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, exch VARCHAR(25))

    INSERT INTO @Table3 VALUES(1, 'A');
    INSERT INTO @Table3 VALUES(2, 'B');
    INSERT INTO @Table3 VALUES(3, 'C');
    INSERT INTO @Table3 VALUES(4, 'D');

    DECLARE @Table4 TABLE (id INT PRIMARY KEY CLUSTERED, int tbl1_id, cnt INT)

    INSERT INTO @Table4 VALUES(1, 2, 19);
    INSERT INTO @Table4 VALUES(2, 4, 2013);

示例查询:

    SELECT tbl1.id, tbl1.ts, tbl2.symbol, IFNULL(tbl3.cnt,0) AS cnt

    FROM TABLE1 tbl1

    JOIN TABLE2 tbl2
    ON tbl1.tbl2_id = tbl2.id

    JOIN TABLE3 tbl3
    ON tbl3.id = tbl1.tbl3_id

    LEFT OUTER JOIN TABLE4 tbl4
    ON tbl1.tbl4_id = tbl4.id

    WHERE tbl1.ts BETWEEN '2013-07-25 09:30:00 AND '2013-07-25 16:00:00'
    AND tbl1.price >= 15.00
    LIMIT 1000;

所以基本上我要做的是,如果tbl4没有tbl1_id,我仍然希望看到来自table1的结果,但为cnt显示0值...当我运行这个查询时,我得到了一堆重复的条目,数据看起来不正确。

共有1个答案

劳宇
2023-03-14

您只能从联接的左手边返回带有匹配项的那个。将表4的连接更改为右连接,它将从右侧返回所有记录。我知道这是一个不使用假数据的示例查询。但我必须用你给我的工作。这可能无法通过复制和粘贴工作,但理论是正确的,你只需要修改它。如果你给出更详细的信息,我会根据这一点量身定做的。

SELECT tbl1.id, tbl1.ts, tbl2.symbol, IFNULL(tbl3.cnt,0) AS cnt

    FROM TABLE1 tbl1

    JOIN TABLE2 tbl2
    ON tbl1.tbl2_id = tbl2.id

    JOIN TABLE3 tbl3
    ON tbl3.id = tbl1.tbl3_id

    RIGHT JOIN TABLE4 tbl4
    ON tbl1.tbl4_id = tbl4.id

    WHERE tbl1.ts BETWEEN '2013-07-25 09:30:00 AND '2013-07-25 16:00:00'
    AND tbl1.price >= 15.00
    LIMIT 1000;
 类似资料:
  • 我有一个PySpark Dataframe,它有两列(,,其类型为),其值为或。我正在尝试添加一个新列,这是这两个列的总和。我遵循Pyspark中的示例:在UDF中传递多列 这显示了一系列的< code>NULL,而不是我期望的结果。 我尝试了以下任何一种方法,以查看数据类型是否存在问题 仍然得到空值。 我试着移除阵列: 这可以正常工作并显示 我试着移除UDF,但是离开了阵列: 这可以正常工作并显

  • 问题内容: 所以我有四个桌子。每个表都有一个与前一个表ID相同的ID。因此,我的点击表中有一个ID和一个广告来源的ID。在广告表中,它有一个广告ID和一个来自其广告系列的ID。所以这是一个例子。 因此,要找出表4中的值从何而来,我需要遍历每个表并检查它们具有哪个ID。基本上,我想知道表1中的哪些值与表4中的值相关联。 表4中的内容是网站的访问者,表1中的内容是互联网广告。我想知道哪些访客来自哪些广

  • 我有 2 张表 和。 特别提款权: 操作员: 我需要选择这个表并将结果插入到另一个表- 卡尔斯: 我需要选择两个表 和,并将结果(经过一些数据操作)插入到 表中。 我使用 JPA,但不明白该怎么做。我有一个想法来创建另一个像 这样的类并编写: 然后从 创建 .class或者还有另一种解决方案?

  • 这是我第一次尝试将更复杂的对象存储到数据库中。我需要一些关于数据库设计的帮助。 要存储并从数据库中重新生成的recipe对象 最复杂的部分是对象。每个食谱可以有不同数量的步骤和不同的配料分配给每一个步骤。 我做了另一个设计,其中与以及与相结合。我认为第一种布局更容易查询,因为我只需查看就可以通过进行搜索,但我不确定。有什么想法吗?

  • 我有这个存储过程。我的问题是当记录不存在于机构表是不返回任何东西。我想说即使没有记录在机构仍然返回,所以我已经添加了左外JOIN机构和_Agency=IsNull(U._Agency,")在顶部。但仍然不返回值。它是返回值时,我采取A._IsActive=1在最后一行出来。我该怎么办id A._IsActive没有值仍然返回。我尝试了相同的ISNull但不工作。

  • 我的数据库中有两个表: 表1:购买物品 表1列出了购买的物品,表2每小时更新一次每件物品的当前价格。因此,从表2中可以清楚地看出,肉类最后一次交易是在2013年2月20日上午10点,而鱼类不是在同一天交易的,它是在2013年2月19日上午9点交易的,鸡肉是在2013年2月20日上午9点交易的。我想做的是,列出表1中的所有项目,并加入表2中各个项目的最后交易价格,如下所示: 这里应该应用什么类型的连