【问题标题】:How to check if table variable have id or not如何检查表变量是否有id
【发布时间】:2019-11-06 11:04:56
【问题描述】:

我有下表变量

DECLARE @insertedTable Table (ServiceId INT)

我从一些 SQL 查询中插入 ServiceId,

现在我需要使用交叉连接 @insertedTable 将值插入到 BranchServices 表中

我写了以下 SQL 查询

INSERT INTO BranchServices
    SELECT b.BranchId
    ,its.ServiceId
    ,CASE WHEN(SELECT MIN(SortValue) FROM BranchServices WHERE FkBranchId = b.BranchId) IS NOT NULL THEN 0 END
     FROM @insertedTable its
    CROSS JOIN Branch b where b.IsActive = 1;

@insertedTable 表不存在ServiceIdBranchServices 表相同时,上述查询工作正常。因为BranchServices的表ServiceId是主键。

所以现在我需要检查,如果BranchServices 表已经有ServiceId 我不需要运行以下查询,否则我需要运行查询。如何使用合并来做到这一点?是的话怎么写

INSERT INTO BranchServices
    SELECT b.BranchId
    ,its.ServiceId
    ,CASE WHEN(SELECT MIN(SortValue) FROM BranchServices WHERE FkBranchId = b.BranchId) IS NOT NULL THEN 0 END
     FROM @insertedTable its
    CROSS JOIN Branch b where b.IsActive = 1;

【问题讨论】:

  • BranchServices 执行LEFT JOIN 并检查ServiceId(在BranchServices 中)的值是否为NULL
  • @Larnu 你能给我一个完整的答案吗
  • @Larnu 不,它不为空

标签: sql-server join merge cross-join


【解决方案1】:

完全猜测:

INSERT INTO BranchServices (BranchId, ServiceId, OtherColumn) --Don't know what the name of the third column is
SELECT b.BranchId,
       its.ServiceId,
       CASE WHEN (SELECT MIN(SortValue)FROM BranchServices WHERE FkBranchId = b.BranchId) IS NOT NULL THEN 0 END
FROM @insertedTable its
     CROSS JOIN Branch b
     LEFT JOIN BranchServices BS ON its.ServiceId = BS.ServiceId
WHERE b.IsActive = 1
  AND BS.ServiceId IS NULL;

旁注,空白对于编写可读代码非常重要,我建议善用使用它。

【讨论】:

  • 为什么要查看AND BS.FkServiceId IS NULL;
  • 先生还有一件事,您的意思是我需要用空格编写 SQL 代码?我是对的
  • "为什么要检查 AND BS.FkServiceId IS NULL;" 因为这是你要求的,@Adam:"所以现在我需要检查一下,如果 @987654323 @表已经有ServiceId下面的查询不需要运行,否则需要运行查询。”.
  • “你的意思是我需要用空格编写 SQL 代码?” 是的,你的 SQL 都是左对齐的,因此更难阅读。
猜你喜欢
  • 1970-01-01
  • 2019-12-02
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2021-11-08
相关资源
最近更新 更多