避免SQL SELECT查询中的冗余代码

避免SQL SELECT查询中的冗余代码,sql,oracle,query-optimization,Sql,Oracle,Query Optimization,我想避免我的查询有一些多余的代码。下面是我想做的一个非常简单的例子: SELECT p.id, p.NOM, CONCAT(p.NANE,'_2') AS CLONE , (SELECT id FROM person WHERE NAME = CONCAT(p.NOM,'_2') ) FROM person p 我有两次相同的代码: CONCAT(PERSON.NAME,'_CLONE') 维护上面的代码并不容易,这只是我尝试做的一个简单示例 是否有一种解决方案

我想避免我的查询有一些多余的代码。下面是我想做的一个非常简单的例子:

SELECT 
   p.id,
   p.NOM,
   CONCAT(p.NANE,'_2') AS CLONE ,
   (SELECT id FROM person WHERE NAME = CONCAT(p.NOM,'_2')  )

FROM person p
我有两次相同的代码:

CONCAT(PERSON.NAME,'_CLONE')
维护上面的代码并不容易,这只是我尝试做的一个简单示例

是否有一种解决方案可以在使用v14.14测试的MySQL中使用类似的工具获得相同的结果:

SELECT 
  p.id,
  p.name,
  CONCAT(p.name,'_clone') as CLONE ,
  (SELECT ID FROM person WHERE name = CLONE) AS CLONE_ID

FROM person p
此代码不适用于Oracle 11.2.0.2.0 我是oracle的新手,所以我不知道上面的MySQL SQL代码的翻译是什么:s


你能帮我找到一个好的写作方法吗

我建议使用内联视图:

SELECT p.id,
       p.name,
      c.name clone_name,
      c.id clone_id
from person p
join
      (SELECT id, concat(name, '_clone') name FROM person) c
on p.name = c.name

我建议使用内联视图:

SELECT p.id,
       p.name,
      c.name clone_name,
      c.id clone_id
from person p
join
      (SELECT id, concat(name, '_clone') name FROM person) c
on p.name = c.name

我编辑了代码,因为我忘记了一些半柱。@Satya:第一个代码在Oracle中工作,第二个代码在MySQL中工作。目的是找出是否有人的名字与当前人的名字相同,后缀为“\u clone”。我编辑了代码,因为我忘记了一些分栏。@Satya:第一个代码在Oracle中工作,第二个代码在MySQL中工作。目的是找出是否有人的名字与当前人的名字相同,后缀为“_clone”。实际上,你的代码与我的代码不一样。我不想在克隆人的名字上加字母,而是在第一个人的名字上加字母,但我对它做了一点修改,效果很好!我保留了接合点,而不是从person p“我做”从SELECT CONCAT。。。NAME\u CLONE,NAME,ID p JOIN SELECT ID,NAME c ON p.NAME\u CLONE=c.NAME。我想接受答案,但也许你应该首先编辑它。你是说你把这两个都换了?如果可以的话,请随意编辑答案。事实上,你的代码和我的代码不一样。我不想在克隆人的名字上,而是在第一人称的名字上,但我已经对它做了一些修改,它可以工作了!我保留了接合点,而不是从person p“我做”从SELECT CONCAT。。。NAME\u CLONE,NAME,ID p JOIN SELECT ID,NAME c ON p.NAME\u CLONE=c.NAME。我想接受答案,但也许你应该首先编辑它。你是说你把这两个都换了?如果可以,请随意编辑答案。