【问题标题】:Join two tables with one nullable FK使用一个可以为空的 FK 连接两个表
【发布时间】:2022-01-20 16:28:51
【问题描述】:

我尝试这样写查询:

WITH
    [order_statements]
AS
(
    SELECT
        *
    FROM
        (
            VALUES
                (1, 1),
                (2, 1),
                (3, NULL),
                (4, 1),
                (4, 2)
        )
            AS [t1]
            (
                [OrderId],
                [OrderStatementId]
            )
),
    [statments]
AS
(
    SELECT
        *
    FROM
        (
            VALUES
                (1),
                (2)
        )
            AS [t1]
            (
                [StatementId]
            )
)
SELECT
    [t2].[OrderId],
    [t1].[StatementId],
    [t2].[OrderStatementId]
FROM
                [statments] AS [t1]
    CROSS JOIN
                [order_statements] AS [t2]
ORDER BY
    [t2].[OrderId],
    [t1].[StatementId]

我想要的结果:

| OrderId | StatementId | OrderStatementId |
|       1 |           1 |                1 |
|       1 |           2 |             NULL |
|       2 |           1 |                1 |
|       2 |           2 |             NULL |
|       3 |           1 |             NULL |
|       3 |           2 |             NULL |
|       4 |           1 |                1 |
|       4 |           2 |                2 |

有什么想法吗?在 [order_statements] 我有 [OrderStatementId] 时,我可以调整行。如果我没有在 [OrderStatementId] 我设置 NULL。最好的解决方案是当我只有一个人可以访问表格时。请帮忙。

【问题讨论】:

    标签: sql join cross-join


    【解决方案1】:

    交叉连接产生您需要的所有组合。除此之外,您还需要左连接原始表以检索额外的值。

    例如,你可以这样做:

    select
      os.OrderId,
      s.StatementId,
      o.OrderStatementId
    from statments s
    cross join (select distinct OrderId from order_statements) os
    left join order_statements o 
       on o.OrderStatementId = s.StatementId
      and o.OrderId = os.OrderId
    order by os.OrderId, s.StatementId
    

    结果:

     OrderId  StatementId  OrderStatementId 
     -------- ------------ ---------------- 
     1        1            1                
     1        2            null             
     2        1            1                
     2        2            null             
     3        1            null             
     3        2            null             
     4        1            1                
     4        2            2                
    

    请参阅db<>fiddle 的运行示例。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多