【问题标题】:SQL check link between two records (CASE, WHEN, THEN)SQL 检查两条记录之间的链接(CASE、WHEN、THEN)
【发布时间】:2019-01-16 12:00:46
【问题描述】:

我在表中有一些记录:

ID Services
2  A
2  C
2  C1
2  D2

我正在尝试进行查询,以选择服务之间的链接。

例如:如果 ID 2 存在服务 C,则检查是否存在服务 C1,结果是或否。

SELECT a. ID, a.service,
CASE 
    WHEN (a.service ='C') = (a.service  = 'C1') THEN 'Yes'
    ELSE 'No'
END      
FROM t1 a

【问题讨论】:

  • 你能举出更多不同类型链接的例子,结果应该是什么?
  • 服务之间的链接我应该从服务地图中手动创建。例如,如果在 ID 中是服务 XZ1,那么在 ID 上必须是服务 FU2。我有大约 15-20 个这样的链接。
  • 你能用一个例子发布预期的输出吗?
  • 预期结果是显示给定 ID 的所有未链接服务。 ID Services RESULT_LINK 2 A No 2 D2 No

标签: sql oracle plsql


【解决方案1】:

试试这个查询:

SELECT *
FROM yourTable t1
WHERE NOT EXISTS (SELECT 1 FROM yourTable t2
                  WHERE (t2.Services LIKE t1.Services + '%' OR
                         t1.Services LIKE t2.Services + '%') AND
                        t1.ID = t2.ID AND t1.Services <> t2.Services);

这仅返回 AD2

Demo

【讨论】:

  • 好!但服务名称中并不总是有 +% :(。一个链接服务可以是 XYZ 和 ABC。
  • 我已经回答了您发布的确切问题。如果您试图在 ABCXYZ 这两个没有共同点的字符串之间建立链接,那么您需要告诉我们我们如何知道存在任何关系。
  • 这种关系是由假设决定的。有人发明了如果在任何 ID 上存在服务 ABC 那么也必须在此 ID 服务 XYZ 上,如果不是,那么对于“系统”来说是错误的,现在我试图找到所有没有关系的 ID。
【解决方案2】:

嗯……这个呢?但是我现在无法独立检查每个 ID 的关系...

SELECT a. ID, a.service,
CASE 
    WHEN a.service IN ('C','C1') THEN 'Yes'
    ELSE 'No'
END      
FROM t1 a

【讨论】:

    【解决方案3】:

    如果我理解正确,你可以使用聚合:

    SELECT ID,
           (CASE WHEN SUM(CASE WHEN service = 'C' THEN 1 ELSE 0 END) > 0 AND
                      SUM(CASE WHEN service = 'C1' THEN 1 ELSE 0 END) > 0 
                 THEN 'Yes' ELSE 'No'
            END) as c_c1_flag
    FROM t1
    GROUP BY ID;
    

    SUM(CASE . . . ) 计算符合条件的行数。 &gt; 0 只是表示至少存在一行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多