0

我有一个名persons为主键的表,而pid不是我有 3 个不同的表(我们称它们ABC),其中pid是外键。

我需要知道pid这些表中是否存在特定内容以及它们中的确切内容。

我不知道这是否可以通过单个查询来实现,但我认为一个函数在我的特定情况下会更好地工作,这样我就可以做到这一点:

SELECT pid, name, sex, func_name(pid) my_str
FORM persons
WHERE pid = 5

然后,根据找到 pid 的表,my_str将类似于:

B | C

pid = 5在表格B和中找到了含义C

我可以使用 COUNT(*) 在函数中使用 3 个 SELECT 来做到这一点。如果结果 > 0,pid = 5则从相应的 SELECT 表中找到。但这似乎是一种愚蠢的做法,建议?

4

2 回答 2

1

像下面这样的东西对你有用吗?我刚刚添加了 case/whens 来向您展示如何测试其他表中的存在性。

select p.pid
      ,p.name
      ,p.sex
      ,case when a.pid = p.pid then 'Yes' else 'No' end as in_a
      ,case when b.pid = p.pid then 'Yes' else 'No' end as in_b
      ,case when c.pid = p.pid then 'Yes' else 'No' end as in_c
  from persons p
  left outer join a on (a.pid = p.pid)
  left outer join b on (b.pid = p.pid)
  left outer join c on (c.pid = p.pid)
 where p.pid = 5;
于 2010-12-27T23:30:25.260 回答
0

对@Ronnis 答案的增强(我没有测试它,但我希望这样的东西会起作用。如果没有,请原谅我迟到了:))

select p.pid,
       p.name,
       p.sex,
       case when a.pid = p.pid then 'A' else '' end |
       case when b.pid = p.pid then 'B' else '' end |
       case when c.pid = p.pid then 'C' else '' end
  from persons p
  left outer join a on (a.pid = p.pid)
  left outer join b on (b.pid = p.pid)
  left outer join c on (c.pid = p.pid);
于 2010-12-27T23:34:00.890 回答