使用join形成SQL语句

时间:2013-12-05 06:55:26

标签: sql database

我是SQL的新手。请帮助我为下面的场景构建一个SQL语句。

我有两张桌子,想加入两张桌子。下面你可以找到我用来加入的陈述。

create table F5 (BT_TYPE int, appln int)
insert into F5 values(2,1)

create table LTB (Field int, lang int, Desc0 varchar(255))
insert into LTB values (1,1,'German')
insert into LTB values (1,2,'English')
insert into LTB values (1,3,'Itailian')
insert into LTB values (1,4,'Free lang')
insert into LTB values (2,1,'2German')
insert into LTB values (2,2,'2English')
insert into LTB values (2,3,'2Itailian')
insert into LTB values (2,4,'2Free lang')

select * from LTB
select * from F5

select a.*, b.Desc0 as bttyp_desc, c.Desc0 as appln_desc 
from F5 a, LTB b, LTB c 
where b.lang=1 and b.Field=a.BT_TYPE 
      and c.lang=1 and c.Field=a.appln

预期结果应如下所示(突出显示)

请帮助我构建SQL语句,其中不应该使用相同的表名两次。

1 个答案:

答案 0 :(得分:0)

  

我得到了正确的输出,但我不想两次使用相同的表名(LTB)

  1. 两次加入LTB
  2. 没有错
  3. 考虑使用显式的ANSI样式JOIN语法,而不是隐式的基于逗号的语法。
  4. 请勿在生产中使用SELECT a.*,而是明确指定所需的列。
  5. 据说你的查询可能看起来像

    SELECT bt_type, appln, b.desc0 bttyp_desc, c.Desc0 appln_desc 
      FROM F5 a JOIN LTB b
        ON b.lang = 1 
       AND a.bt_type = b.field JOIN LTB c
        ON c.lang = 1 
       AND a.appln = c.field;
    

    现在,如果由于某种原因你无法忍受加入LTB两次,你可以使用条件聚合重写查询

    SELECT bt_type, appln, 
           MAX(CASE WHEN field = BT_TYPE THEN desc0 END) bttyp_desc,
           MAX(CASE WHEN field = appln   THEN desc0 END) appln_desc
      FROM F5 a JOIN LTB b
        ON b.lang = 1 
       AND (a.bt_type = b.field OR
            a.appln = b.field)
     GROUP BY bt_type, appln
    

    输出(在两种情况下):

    | BT_TYPE | APPLN | BTTYP_DESC | APPLN_DESC |
    |---------|-------|------------|------------|
    |       2 |     1 |    2German |     German |
    

    这是 SQLFiddle 演示