联合查询不起作用

时间:2014-02-16 13:51:52

标签: union visual-foxpro

我正在使用vfp9。

我有两张桌子:

Countries with the field:
id
--
1
2
3

Students with the fields:
id  nname  nation1id   nation2id   nation3id
--------------------------------------------
1   A         2            1  
2   B         1
3   C         2            3          1

I want a query with this output:
countryid    nname   dummy
--------------------------
1             B        1
1             A        2
1             C        3
2             A        1
2             C        1
3             C        2

换句话说,对于ID为1的国家,我想首先列出将其作为nation1id的人,然后将其作为nation3id列出的人,以及将其作为nation3id的人。然后我会为id为2的国家做同样的事情,依此类推。

我试过这个问题:

 select countries.id from countries ;
 (SELECT nname, 1 FROM students WHERE nation1id = countries.id ;
 UNION ;
 select nname, 2 FROM students WHERE nation2id = countries.id ;
 UNION ;
 select nname, 3 FROM students WHERE nation3id = countries.id ;
 order by 2)

但是获取“命令包含无法识别的词组/关键字”错误消息。

此致

Jan Nordgreen

1 个答案:

答案 0 :(得分:0)

错过了您的国家/地区表列,但失败的原因是您列出了两个表...您的国家/地区和您的(选择/联合),但它们之间没有逗号或JOIN条件。 至于你的国家表没有列出字段,我相信你正在寻找国家的名字,但在学生的表中有“nname”,不知道这是否正确。无论如何,你可以得到你的查询输出如下。

select ;
      allStNat.Nation as CountryID,;
      allStNat.nname,;
      allStNat.NationSort ;
   from ;
      ( SELECT nname, ;
               nation1id as Nation, ;
               1 as NationSort;
           FROM students ;
          WHERE nation1id > 0;
        UNION ALL;
        select nname, ;
               nation2id as Nation,;
               2 as NationSort;
           FROM students ;
          WHERE nation2id > 0;
        UNION ALL;
        select nname, ;
               nation3id as Nation,;
               3 as NationSort ;
           FROM students ;
          WHERE nation3id > 0 ) allStNat;
   order by ;
      1, 3, 2

如果您想要的国家/地区表中有其他内容,我只会稍微更改实际国家/地区的名称并调整order by子句,因为列表中还有一列。

select ;
      allStNat.Nation as CountryID,;
      c.Country,;
      allStNat.nname,;
      allStNat.NationSort ;
   from ;
      ( same select/union query above ) allStNat;
         JOIN Countries c ;
            ON allStNat.Nation = c.id
   order by ;
      1, 4, 3