SQL多表

| 我有2组2个相应的表(共4个表)。两组仅对应一列。我希望查询在两个联接表中的该列中进行搜索,并能够返回所选列中的值,即使该列在另一表中不存在也是如此。 目前,我的查询如下:
select z
FROM A1
INNER JOIN A2 
ON A1.x=A2.x
WHERE A1.x= \'25\'
UNION
select z
FROM B1
INNER JOIN B2
ON B1.x=B2.x
WHERE B1.x= \'25\'
只要我要查找(连接的)表A和B共有的一列,UNION就可以工作。我希望能够从仅存在于A或B中的列中获取值,而不必同时存在于两者中。 提前致谢。 编辑: 基本上,我希望在单独的表上进行两个完全独立的查询,但是在一个查询中,只有一个选择。 例:
  Table A1
  x | y
  ------
  1 | a
  2 | b

  Table A2
  x | z
  ------
  1 | c
  2 | d

  Table B1
  x | v
  ------
  3 | e
  4 | f

 Table B2
  x | w
  ------
  3 | g
  4 | h
因此,我想查找具有x的指定值的列变量(例如v,w,y或z)。例如选择w,其中x = 4应该给我h;选择z,其中x = 2应该给我d。     
已邀请:
        使用UNION时,每个select语句中的列数必须相同。您可以为缺少的列添加常量值。每列还必须具有相同的数据类型。
select Column1, null as Column2
from T1
union
select \'\', Column2
from T2
根据@Adrian的评论,您当然可以使用
null
作为常数。否则,您需要选择用于该列的数据类型的常量值。
select Column1, null as Column2
from T1
union
select null, Column2
from T2
使用问题中提供的样本数据:
select A1.x, A2.z as \'y\'
from A1
  inner join A2 
    on A1.x=A2.x
where A1.x= 4
union
select B1.x, B2.w as \'y\'
from B1
  inner join B2
    on B1.x=B2.x
where B1.x= 4
结果:
x   y
4   h
用2代替4 结果:
x   y
2   d
    
        就像这样:
select Column1, ColumnThatOnlyExistsInContextA, null as ColumnThatOnlyExistsInContextB
FROM A1
INNER JOIN A2 
ON A1.ID=A2.ID
WHERE A1.ID= \'25\'

UNION

select Column1, null, ColumnThatOnlyExistsInContextB
FROM B1
INNER JOIN B2
ON B1.ID=B2.ID
WHERE B1.ID= \'25\'
    
        当使用
UNION
时,请确保所有查询返回具有相同类型的相同列数的结果集。如果要在第一个查询没有的并集中从第二个查询返回一个列,则可以修改第一个查询以使该列具有NULL值。     
        所以您基本上想做:
select Column1
FROM A1
INNER JOIN A2 
ON A1.ID=A2.ID
WHERE A1.ID= \'25\'
UNION
select Column2
FROM B1
INNER JOIN B2
ON B1.ID=B2.ID
WHERE B1.ID= \'25\'
对? 如果是这样,您的问题可能只是
Column1
Column2
是不同的类型。所以,做类似的事情
select cast(Column1 as varchar(255))
select cast(Column2 as varchar(255))
应该管用!     
        好吧,UNION的唯一要求是每个结果集中被UNIONed的字段的数量和类型必须匹配。因此,如果B具有Column2而A没有,则可以从联接的As中选择Column1,从联接的B中选择Column2,并提供A.Column1和B.Column2相同的类型(如果需要,可以CAST或CONVERT )语句仍然有效。也许我不了解这个问题,但是我认为这很容易解决。     

要回复问题请先登录注册