【问题标题】:Selecting result from two tables in SQL Server从 SQL Server 中的两个表中选择结果
【发布时间】:2019-10-14 13:53:24
【问题描述】:

我有以下表格。

终端:

出口:

vpos_out:

当我执行以下查询时,一切看起来都很好:

SELECT TOP 2
    o.id,
    mt.id AS [activated_device],
    vo.id AS [outlet]
FROM 
    terminalmt WITH (NOLOCK) 
LEFT JOIN 
    outlet o WITH (NOLOCK) ON o.id = mt.outlet_id AND  mt.status = 0
LEFT JOIN 
    vpos_out vo WITH (NOLOCK) ON vo.wallet_id = o.wallet_id AND vo.status = 1
WHERE 
    o.wallet_id = 356988

我得到以下结果:

问题是当我将 mt.status 值更改为 12 (显然不存在的状态。

在这种情况下,我没有得到任何结果。

我想得到以下结果

有什么想法吗?

【问题讨论】:

  • 您的 where 子句正在将您的左连接变为内连接。另外,小心将 NOLOCK 溅到各处。这不是一个没有任何副作用的神奇快速按钮。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
  • 你为什么要加入 wallet_id?它对于连接中的任何表都不是唯一的。

标签: sql-server join select


【解决方案1】:

我认为你需要(注意 where 子句中的额外术语):

    SELECT
      TOP 2
      o.id,
     mt.id as [activated_device],
     vo.id as [outlet]
      FROM terminalmt WITH(NOLOCK) 
      LEFT JOIN outlet o WITH(NOLOCK) ON o.id = mt.outlet_id AND  mt.status = 0
      LEFT JOIN vpos_out vo WITH(NOLOCK) ON vo.wallet_id = o.wallet_id AND vo.status = 1
    WHERE o.wallet_id = 356988 OR o.id is NULL

处理连接到出口表的另一侧没有行的地方。

【讨论】:

  • 或者更简单的方法是将 o.wallet_id 谓词移动到连接中。 :)
  • 我认为这不能正常工作。有出口价值的记录。如果有任何值,我希望在 oultet 列中显示一个数字,而不是 NULL 。
  • 我认为你需要分享更多细节。由于没有表结构或示例数据,我们都只是在猜测 wallet_id 列是否可以为空(我假设它不是)。我不认为你的逻辑虽然有效。在您的示例查询中,wallet_id 必须有一个值,因此同一张表上的 id 必须有一个值。
【解决方案2】:

由于您总是需要 outlet 记录,其余部分是可选的,具体取决于过滤,您需要从 outlet 表开始,然后将 left join 其余部分放在该表上。

像这样:

SELECT TOP 2
    o.id,
    mt.id AS [activated_device],
    vo.id AS [outlet]
FROM 
    outlet o WITH (NOLOCK) 
LEFT JOIN 
    terminal mt WITH (NOLOCK) ON o.id = mt.outlet_id AND mt.status = 12
LEFT JOIN 
    vpos_out vo WITH (NOLOCK) ON vo.wallet_id = o.wallet_id AND vo.status = 1
WHERE 
    o.wallet_id = 356988

我同意关于在所有桌子上涂抹WITH (NOLOCK) 的评论。这主要意味着您不关心结果的准确性和正确性。在使用它之前,您应该三思(或三次)。

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多