如何从没有匹配列的多个表中进行选择

时间:2013-06-27 08:16:44

标签: mysql

我想在三个没有匹配列的表之间进行查询。我使用了UNION但是用结果idDisplayNetwork替换了idDeviceidCountryin

SELECT idcountry, 
       name 
FROM   country 
UNION 
SELECT iddevice, 
       name 
FROM   device 
UNION 
SELECT name, 
       iddisplaynetwork 
FROM   displaynetwork 

我想要这种输出

   { idCountry: '18ec1e07-9c89-4d2c-aefe-a7bd8966fab4',
    Name: 'Russia' },
   { idCountry: '31ceda51-9ce8-4380-bd41-c95f660e2ad4',
    Name: 'Turkey' },
   { idDevice: 'c0180c24-2df5-4082-b050-94dfaf1d5174',
    Name: 'Desktop and Laptops' },
  { idDisplayNetwork: '771434a0-0e6d-4206-90f5-f6abf85690d1',
    Name: 'search network' },

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

如果这些ID相同,则应在查询中重命名输出列,类似于:

SELECT idcountry AS ID, 
       name 
FROM   country 
UNION 
SELECT iddevice AS ID, 
       name 
FROM   device 
UNION 
SELECT 
       iddisplaynetwork AS ID,
       name 
FROM   displaynetwork 

您刚刚发布的结果是不可能的,但您可以这样做:

SELECT idcountry AS ID, 
           name,
           'Country' AS Type
    FROM   country 
    UNION 
    SELECT iddevice AS ID, 
           name,
           'Device' AS Type
    FROM   device 
    UNION 
    SELECT 
           iddisplaynetwork AS ID,
           name,
           'Display Network' AS Type
    FROM   displaynetwork 

输出将如下:

{ ID: '18ec1e07-9c89-4d2c-aefe-a7bd8966fab4',
    Name: 'Russia', type: 'Country' },
   { ID: '31ceda51-9ce8-4380-bd41-c95f660e2ad4',
    Name: 'Turkey', type: 'Country' },
   { ID: 'c0180c24-2df5-4082-b050-94dfaf1d5174',
    Name: 'Desktop and Laptops', type: 'Device' },
  { ID: '771434a0-0e6d-4206-90f5-f6abf85690d1',
    Name: 'search network', type: 'Display Network' },

答案 1 :(得分:0)

UNION statements 需要共享相同的列才能正常工作。 如指定的那样,第一个语句的列名称用于其他结果集。

答案 2 :(得分:0)

如果他们不共享相同的列(数据类型),则将结果集附加到彼此没有任何意义。这是一个语义错误,与MySQL无关。

如果要连接每个表而不是附加结果,请使用JOIN语句。 这假定所有表共享至少1个用于引用完整性的键。

实施例

SELECT n.*, d.*, c.* FROM displaynetwork n
JOIN device d
ON n.name = d.name
JOIN country c
ON n.name = c.name

<强>更新

尝试使用UNION ALL代替UNION

<强>更新

有2个表,颜色和名称,名称(名称,randomNumber)和颜色(id,颜色),以下语句正是您的输出:

SELECT id, color FROM colors
UNION ALL
select randomNumber, name FROM names

所以对我来说,它不一定是列的别名或名称。但是我使用MariaDB,不知道这是否有所不同。