【问题标题】:SQL Server 2012 join querySQL Server 2012 连接查询
【发布时间】:2018-01-31 14:45:25
【问题描述】:

我有 2 张桌子:Fields{id, testid, labid, upperlimit, lowerlimit)LabTest{id, testid, labid, upperlimit, lowerlimit)

Sample data: Fields: 0, testid1, 1, 10, 20
                     1, testid2, 2, 10, 20

             LabTest: 0, testid1, 1, 40, 50
                      1, testid1, null, 50, 60
                      2, testid2, null, 55, 67
                      3, testid2, null, 67, 78
                      4, testid2, null, 78, 89

加入 testid1 应该返回 1 行

加入 testid2 应该返回 3 行

如果 Fields 表中的labid 不为空且testid 不为空,那么我需要使用LabTest 表中的upperlimitlowerlimit,其中Fields.testid=LabTest.testidFields.labid=LabTest.labid

如果我使用左连接(因为我还需要获取没有 testid 的字段):

select * from Fields left join LabTest on Fields.testid=LabTest.testid

无论labid 是否为空,我都会取回所有字段(使用上述示例数据的 5 行),但是

我想要得到的只是带有 LabTest.labid 的一行,而不是 null 如果这不存在,那么只有那时我才想得到 LabTest.labid = null 的行

【问题讨论】:

  • 请标记正确的 RDBMS,并且只标记正确的 RDBMS。 MySQL 和 SQL Server 是完全不同的产品。
  • 使用inner join 并将两个条件都放在那里:Fields.testid=LabTest.testid and Fields.labid=LabTest.labid
  • @Lamak 我刚刚编辑了我的问题,为什么我使用left join

标签: sql-server join sql-server-2012


【解决方案1】:

使用内连接或如果使用 Where 子句过滤左连接

;WITH CTE
AS
(
    select 
      RN = ROW_NUMBER() OVER(PARTITION BY Fields.Id ORDER BY labid),
      Fields_Id = Fields.id,
      Fields_testid = Fields.testid,
      Fields_labid = Fields.labid,
      Fields_upperlimit = Fields.upperlimit,
      Fields_lowerlimit = Fields.lowerlimit,

      LabTest_Id = LabTest.id, 
      LabTest_testid = LabTest.testid, 
      LabTest_labid = LabTest.labid,
      LabTest_upperlimit = LabTest.upperlimit, 
      LabTest_lowerlimit = LabTest.lowerlimit
      from Fields 
          left join LabTest 
        on Fields.testid=LabTest.testid

)
SELECT
    *
    FROM CTE
        WHERE RN = 1

【讨论】:

  • 用户指定了一行。
  • @benjaminmoskovits 请查看更新后的答案。你不能选择前1,因为可以有多个ID
  • 它不起作用,我必须更改 RN = x 才能找到具有正确值的行
  • 试试 ORDER BY labid DESC
  • 它看起来是有效的,但是当一个字段有多个 LabTests with labid = null 而 none with labid not null 我只得到一行,但我需要得到所有这些
【解决方案2】:

试试这个:

select top 1   *
 from Fields left join LabTest
 on Fields.testid=LabTest.testid
where LabTest.labid is not null

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多