【问题标题】:how to simulate a default record for a select in MySQL [duplicate]如何模拟MySQL中选择的默认记录[重复]
【发布时间】:2019-04-09 21:51:14
【问题描述】:

我遇到了一个涉及别名查找的 MySQL 问题。我想要一个可以查找别名的表/视图/函数/事物。我想要它在 SQL 中,因为我想使用输出来匹配任何别名的记录。

问题是我想隐含地包括所有不在表中的 ID 仅具有自身别名的琐碎情况。也就是说,给定一个 ID = 'E' 不在别名表中,返回一个别名 'E'。

少部分ID有多个Aliases,大量ID只能自己识别。

如果一个函数可以返回一个值列表,它就可以工作,但这似乎是不可能的。它可以返回一串分隔的 ID,但我没有看到如何拆分字符串并使用生成的 ID。

我无法让视图工作,因为我没有看到传递我们要查找别名的目标 ID 的方法。

例如:

AliasTbl

ID  Alias
--  -----
A   A
A   B
A   C
B   A
B   B
B   C
C   A
C   B
C   C

RecordTbl

ID  other fields
--  ------------  ...
A   foo
B   bar
C   zot
D   other
E   another
...

因此,如果 ID = 'B' 具有别名 'A'、'B'、'C',我希望返回所有三个值。 (请注意,我使用术语“别名”来包含 ID 本身。)

SELECT *
FROM RecordTbl
WHERE ID in
      (SELECT Alias
      FROM AliasTbl
      WHERE ID = 'B');

...应该返回...

ID  other fields
--  ------------  ...
A   foo
B   bar
C   zot

对于除“A”、“B”或“C”以外的任何值...

SELECT *
FROM RecordTbl
WHERE ID in
      ( given any ID do some magic to return the ID as its only Alias );

所以对于 ID = 'E',返回...

ID  other fields
--  ------------  ...
E   another

【问题讨论】:

  • 上面给出的答案看起来和这里描述的情况不一样。

标签: mysql


【解决方案1】:

左连接确保 Alias 表中不存在的记录返回空别名。然后 ifnull() 函数将 null 替换为记录 ID。

选择record.ID, ifnull(alias.Alias, record.ID) 从 RecordTbl 作为记录 left join AliasTbl as alias on record.D = alias.ID

【讨论】:

  • 也许我没有很好地解释这一点,但我认为这不是我想要的。这个想法是使用别名来过滤 RecordTbl。
  • 我想我可能已经找到了一种方法来做我想做的事。通过使用 UNION DISTINCT,我可以添加一个“假”记录来模拟简单的情况:一个只有别名的 ID 就是它自己。然后我可以使用它来过滤 RecordTbl SELECT r.* FROM RecordTbl r where ID in (SELECT Alias FROM AliasTbl a WHERE a.ID = 'E' UNION DISTINCT SELECT 'E' FROM dual) order by r.ID;跨度>
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 2020-12-08
  • 1970-01-01
  • 2019-04-25
  • 2012-07-26
  • 1970-01-01
  • 2020-12-24
  • 2012-03-27
相关资源
最近更新 更多