【问题标题】:SQL Query based on specific conditions基于特定条件的 SQL 查询
【发布时间】:2019-09-19 19:22:29
【问题描述】:

图 1 表示 TABLE A 和 TABLE B 的当前状态。

当前的实现是将新的 MId 提取到表 B 并从基本进程复制 SqlQuery,以防出现新市场或现有市场。以下查询用于此:

SELECT A.MId, B1.Loop, B1.Segment, B1.SqlQuery, B1.UseDefault
FROM TableB B1 WITH (NOLOCK)
INNER JOIN TableA A WITH (NOLOCK) ON B1.MId IN (100, 200) 
                                  AND B1.MId = A.BaseMarket 
                                  AND ISNULL(A.POCId, 0) > 0
LEFT JOIN TableB B2 WITH (NOLOCK) ON A.MId = B2.MId
WHERE B2.MId IS NULL

图 2 显示了表 A 中的更新数据和表 B 的所需状态。所需的实现是:

  1. 如果是新市场(XYZ 市场 - 2001、2002),则将新的 MId 提取到表 B 并从基本进程复制 SqlQuery
  2. 如果表 B 中已存在市场配置(市场 ABC - 1001 和 1002),则复制现有配置的 SqlQuery。

这是表 A 和 B 的完整流程。两个表中的基本配置(100 和 200)最初是手动插入的,包括循环和段。

  1. 引入了一个新市场,并在表 A 中创建了一个新的 MId。假设市场 ABC 为 1001 和 1002。

  2. 在表 B 中为每个 MId 插入相应的记录,并从表 B 中的基本配置复制数据。插入的记录(SqlId - 3 和 4)

  3. 表 B 中的 SqlQuery 列因特定业务请求而手动更新。 (SqlId - 3 和 4)。因此,不同的查询。

  4. Market ABC 在前端更新,这会在表 A 中创建两个新条目(MId - 1003 和 1004)。此外,还创建了新市场 XYZ(MId - 2001 和 2002)。

  5. 在表 B 中创建的相应条目应参考市场 XYZ(SqlId - 7 和 8)的基本配置,因为它是一个新市场,但应复制市场 ABC(MId - 1001 和 1002)的现有配置,因为它是配置已经存在。

如果单个查询可以使用 Case 语句实现此要求,我正在寻找建议。感谢您的帮助!

【问题讨论】:

  • 所以你正在寻找INSERT 行从TableATableB,而他们还没有在TableB 中,对吗?对于 TableB... Segment 来自哪里? SqlQuery 来自哪里? UseDefualt 来自哪里?
  • 图片并不是分享数据的好方法。 Why? 这里还需要解释一下输出的一些内容。您想要的输出中有一些行在示例数据中不存在。
  • 我已对问题添加了更多解释,对于使用这些图像,我深表歉意。我只是认为图像中的颜色编码可以更好地理解问题。我的错!

标签: sql sql-server


【解决方案1】:

我猜市场配置已经存在,您实际上是指MarketNameType 的组合。所以这里是查询

SELECT
  A.NewId, B.Loop, B.Segment, B.SqlQuery, B.UseDefault
FROM (
  SELECT
    A1.MId AS NewId, A2.MId AS RefId
  FROM
    TableA A1
  INNER JOIN
    TableA A2
  ON
    (A1.MarketName = A2.MarketName AND A1.Type = A2.Type) -- use your market configuration logic here
  OR
    A1.BaseMarket = A2.BaseMarket
  WHERE
    A1.Mid NOT IN (SELECT MId FROM TableB)
) As A
INNER JOIN
  TableB B
ON (A.RefId = B.MID)

首先,我们自加入 TableA 以在此处获取参考 MId 为 RefId。然后我们用TableB 加入新的派生表。

希望这会有所帮助。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多