在UNION SELECT中使用SQL Case来组合两个没有相似字段的表

时间:2013-10-15 07:47:46

标签: sql case derby

我有两个SQL表(不能被修改,这是一个如何在没有列的情况下获取它的问题),我需要在使用内连接时找出表类型列出城市和州:

CREATE TABLE authors 
  ( 
  au_id    CHAR(3)     NOT NULL, 
  au_fname VARCHAR(15) NOT NULL, 
  au_lname VARCHAR(15) NOT NULL, 
  phone    VARCHAR(12)         , 
  address  VARCHAR(20)         , 
  city     VARCHAR(15)         , 
  state    CHAR(2)             , 
  zip      CHAR(5)             , 
  CONSTRAINT pk_authors PRIMARY KEY (au_id) 
  ); 

CREATE TABLE publishers 
  ( 
  pub_id   CHAR(3)     NOT NULL, 
  pub_name VARCHAR(20) NOT NULL, 
  city     VARCHAR(15) NOT NULL, 
  state    CHAR(2)             , 
  country  VARCHAR(15) NOT NULL, 
  CONSTRAINT pk_publishers PRIMARY KEY (pub_id) 
  ); 

我正在尝试使用CASE来正确输出选择:

SELECT CASE
    WHEN LCASE(SUBSTR(/*suppose id*/, 0, 1)) == 'a'
    THEN 'author'
    ELSE 'publisher'
    END
AS type, city, state
FROM authors
INNER JOIN publishers

这些表的格式是id不同,但也有不同的名称:

INSERT INTO authors VALUES('A01','Sarah','Buchman','718-496-7223', 
      '75 West 205 St','Bronx','NY','10468'); 
INSERT INTO publishers VALUES('P01','Abatis Publishers','New York','NY','USA'); 

我正试图达到这样的输出:

type        |   city        |   state
--------------------------------------------------
author      |   Rochester   |   NY
author      |   Syracuse    |   NY
publisher   |   New York    |   NY

如果两个表没有相似的列,我怎样才能有效地进行比较?我可以调用表上的字段值来检查它是否为null而不抛出SQL异常吗?

1 个答案:

答案 0 :(得分:2)

由于没有列可以在两个表之间进行比较,即在笛卡尔积之后没有任何可以过滤掉行的内容,因此内连接不会服务于目的。它更像是从两个多组中选择记录并将它们组合起来。在T-SQL中,这可以使用Union实现:

select 'authors' as [type]
       , city,state
       from authors
union 
select 'publishers' as [type]
       , city,state
       from publishers