【问题标题】:LEFT JOIN but take only one row from right sideLEFT JOIN 但从右侧只取一行
【发布时间】:2020-12-25 21:48:52
【问题描述】:

上下文:

我有两张桌子:ks__dokumentks_pz。这是一对多的关系,其中来自 ks__dokument 的记录可能有多个来自 ks_pz 的记录。

目标:

我想显示来自ks__dokument 的每一行,而来自ks__dokument 的每一行只能显示一次。

我尝试了什么:

这是我尝试过的查询:

SELECT DISTINCT ks_id, * FROM ks__dokument AS dok1 
LEFT JOIN ks_pz ON ks_id = kp_ksid

但它仍然显示重复。

编辑

  • 不需要 ORDER BY 和 WHERE。
  • 我不需要 DISTINCT,这正是我尝试过的。

表格结构

ks__dokument 结构:

| ks_id | X | X | X | X | X | X |

ks_pz:

| kp_id | kp_ksid | X | X | X |

'X' 是不重要的列。 kp_ksid 是 ks__dokument 的外键。

【问题讨论】:

  • 请记住,SELECT DISTINCT 适用于整个选定的行,而不仅仅是第一列。
  • 真的需要DISTINCT吗?这意味着您的表中有确切重复的行,这可能是一个更大的问题。
  • 我不需要那种独特的,这只是我尝试过的,
  • @Arkadiusz 。 . .限定查询中的列名,以便阅读问题的人了解这些列的来源。
  • 如果我理解正确,那么一个ks_document 有0 到n ks_pz。两列 ks_idkp_ksid 来自这两个表。一个是ks_document 的主键,另一个在ks_pz 中,不可为空,并且对ks_document 主键有外键约束。在这种情况下,您的查询会显示所有ks__dokument 及其所有ks_pz。现在您的标题表明您只想在每个ks_document 行加入一个ks_pz 行。哪一个?请显示示例数据并解释是什么让您选择要选择的行。

标签: sql sql-server


【解决方案1】:

使用OUTER APPLY:

SELECT dok1.*, k2.*
FROM ks__dokument dok1 OUTER APPLY
     (SELECT TOP (1) *
      FROM ks_pz 
      WHERE ks_id = kp_ksid
      ) k2
WHERE ks_usuniety = 0 AND
      ks_data_otrzymania >= '2020-08-31'
ORDER BY ks_rok, ks_nr ASC;

通常,子查询中会有一个ORDER BY 来指定要返回哪个行。

您的问题的结构使您无法知道 ORDER BY 应该在子查询中还是在外部查询中——WHERE 条件也是如此。

您确实需要指定列的来源表。

【讨论】:

  • 对不起。这是完全没有必要的。它应该在外部查询中。
  • 我删除了 WHERE 和 ORDER BY,这几乎是我所需要的,只是我需要显示来自 ks_pz 的连接行。
  • @Arkadiusz 。 . .选择所需的列。他们都在那里。
【解决方案2】:

您可以尝试以下方法 - 将您的 WHERE 条件子句移至 ON 子句

SELECT DISTINCT ks_id, * FROM ks__dokument AS dok1 
LEFT JOIN ks_pz ON ks_id = kp_ksid
and ks_usuniety = 0 AND ks_data_otrzymania >= '2020-08-31' 
ORDER BY ks_rok, ks_nr ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多