Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-结合外部联接和内部联接_Sql Server - Fatal编程技术网

Sql server SQL Server-结合外部联接和内部联接

Sql server SQL Server-结合外部联接和内部联接,sql-server,Sql Server,我有3个表,我必须在表A和表B之间内部连接,但在表A和表C之间保留外部连接 我可以在同一个查询中合并外部联接和内部联接吗?我可以嵌套查询并获得所需的结果,但无法在同一个查询中同时执行两个连接。在其他SQL语言中,连接顺序似乎很重要。SQL Server中也是这样吗 好的,下面是场景 考虑3张表。表A、表F、表D 我需要记录集包含D中的所有行,而不管它是否存在于F中(在它与A内部连接之后)。因此,我想到了一个外部连接。我需要的是: 首先在a和F之间进行内部联接以获得一个集合(这可能是一个空集合)

我有3个表,我必须在表A和表B之间内部连接,但在表A和表C之间保留外部连接

我可以在同一个查询中合并外部联接和内部联接吗?我可以嵌套查询并获得所需的结果,但无法在同一个查询中同时执行两个连接。在其他SQL语言中,连接顺序似乎很重要。SQL Server中也是这样吗


好的,下面是场景

考虑3张表。表A、表F、表D

我需要记录集包含D中的所有行,而不管它是否存在于F中(在它与A内部连接之后)。因此,我想到了一个外部连接。我需要的是:

  • 首先在a和F之间进行内部联接以获得一个集合(这可能是一个空集合)
  • 然后用D与(1)中的记录集进行外部联接

  • 可以在同一查询中同时使用内部联接和外部联接,但它们的顺序很重要。请参见此问题:

    确保可以在同一查询中执行联接:-

    FROM TableA a
    INNER JOIN Table b ON a.TableA_ID = b.TableA_ID
    LEFT OUTER JOIN Table c ON a.TableA_ID = c.TableA_ID
    

    是的,您可以在同一个查询中同时执行这两项操作,是的,顺序很重要。

    如果我理解正确,您希望这样做:

    select
        *
    from
        a 
        left outer join c
            inner join b on c.bID = b.ID
        on a.cID = c.ID
    

    从你的后续行动来看,听起来你想要一个“有条件的”内部连接

    本质上,一个“如果A和B有一个记录,内部连接到C”

    但是,您可能会遇到这样的问题:查询中的内部联接没有显示A没有与B或C关联的记录的记录。如果它们在同一“作用域”,则内部联接将始终运行,您不能有条件地根据顺序让它们运行

    您要么使用两个左联接并过滤掉不需要的记录,要么使用视图来确定内部联接的范围

    前。 A.ID=vw_MyView.A_ID上的左连接vw_MyView

    其中MyView有表B和表C以及内部联接。这将允许在视图内部运行内部联接,然后您可以将联接留给结果。

    顺序应该无关紧要


    这是维基媒体共享空间的维恩图。不管查询顺序如何,都会得到圆A和B之间的重叠,C的列为空,而C没有重叠A和B的组合。

    问题可能不是连接(Anthony向您展示了如何执行您向我们描述的操作)。请记住,人们在使用左联接时经常遇到问题,因为他们试图在where子句中放入引用联接右侧表的内容,从而将其从外部联接转换为内部联接(除非您正在查找第二个表字段为null的记录,该字段提供第一个表中的记录,而不是第二个表中的记录)


    如果我们说您使用的实际代码没有产生所需的结果以及一些示例数据和示例结果,我们可以更好地帮助您。

    对于我的情况,我需要设置表别名,以便查询正常工作:

    SELECT * FROM ("purchased_items" p1
         INNER JOIN "purchase_orders" po1 ON (po1."id" = p1."purchase_order_id")) AS p4
    LEFT OUTER JOIN (purchased_items p2
          INNER JOIN "purchase_orders" po2 ON (po2."id" = p2."purchase_order_id")) AS p5
    ON (p4.item_variant_id = p5.item_variant_id AND p4.delivery_date < p5.delivery_date) 
    WHERE p5.delivery_date IS NULL AND p4.delivered <> 0 
    
    SELECT*FROM(“购买的物品”p1
    将(po1.“id”=p1.“采购订单id”)上的“采购订单”po1内部联接为p4
    左侧外部连接(已购买的项目p2
    将(po2.“id”=p2.“采购订单id”)上的“采购订单”po2内部联接为p5
    打开(p4.item\u variant\u id=p5.item\u variant\u id和p4.delivery\u date
    这出现在1到0或多的情况下,其中多有一个FK

    两种方法
    上的
    的顺序

    外部
    连接放在最后

    很遗憾,您更改了表名。我将使用后面的名称

    declare @TableD TABLE (PeopleID int primary key, Name varchar(10));
    INSERT INTO @TableD VALUES
           (1, 'Chris')
         , (2, 'Cliff')
         , (3, 'Heather');
    
    declare @TableA TABLE (ThingID int primary key, ThingName varchar(10))
    INSERT INTO @TableA VALUES
           (14, 'Bike')
         , (17, 'Trailer')
         , (18, 'Boat');
    
    declare @TableF TABLE (PeopleID int, ThingID int, primary key (PeopleID, ThingID));
    INSERT INTO @TableF VALUES
           (1, 18)
         , (1, 17)
         , (2, 14);
    
    SELECT D.Name, A.ThingName
    FROM @TableD D 
    LEFT JOIN @TableF F
         JOIN @TableA A 
           ON A.ThingID = F.ThingID 
      ON F.PeopleID = D.PeopleID
    order by D.Name, A.ThingName;
    
    SELECT D.Name, A.ThingName
    FROM @TableF F 
    JOIN @TableA A 
      ON A.ThingID = F.ThingID 
    right join @TableD D
      ON D.PeopleID = F.PeopleID 
    order by D.Name, A.ThingName;
    
    Name       ThingName
    ---------- ----------
    Chris      Boat
    Chris      Trailer
    Cliff      Bike
    Heather    NULL
    

    我只需要说,这条评论对我帮助很大。在尝试各种内部联接和左外部联接组合时,我一直坚持使用括号的位置以及如何正确联接表。谢谢!我不得不为p5添加一个
    select blah from
    子句。很棘手!如果您将“on a.cID=c.ID”移到下面“left outer join c”这不会给出相同的结果,或者我只是遗漏了什么?这种行为在什么地方有记录吗?我没有意识到on不必直接跟随联接。我认为您有一个和c backwards,它没有给出表D上的所有行(您称之为c)