使用的select语句的列数不同

qoefvg9y  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(349)

我有一个错误“使用的select语句有不同的列数”
我的问题

SELECT

* FROM

inventory 
WHERE
barcode1 = 'DR963560860GYYQBKBBD2' 
OR barcode2 = 'DR963560860GYYQBKBBD2' 
OR barcode3 = 'DR963560860GYYQBKBBD2' 
OR barcode4 = 'DR963560860GYYQBKBBD2' UNION
SELECT
p.id AS 'PartId',
m.`Name` AS 'Model',
c.`Name` AS 'Color',
pt.`Name` AS 'PartType' 
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId 
WHERE
barcode1 = @barcode
OR barcode2 = @barcode
OR barcode3 = 'DR963560860GYYQBKBBD2' 
OR barcode4 = 'DR963560860GYYQBKBBD2';

我想得到的是第一个select语句中inventory表中的所有数据,另一个来自另一个表。
之前,我有两个问题

SELECT
    * 
     FROM
    inventory 
    WHERE
    barcode1 = @Barcode 
    OR barcode2 = @Barcode 
    OR barcode3 = @Barcode 
    OR barcode4 = @Barcode`

它将检索库存中的所有信息,另一个是

SELECT
p.id AS 'PartId',
m.`Name` AS 'Model',
c.`Name` AS 'Color',
pt.`Name` AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId 
WHERE
barcode1 = @Barcode
OR barcode2 = @Barcode
OR barcode3 = @Barcode
OR barcode4 = @Barcode

只需加载四列。
由于我的输出加载太慢,我将把它合并到一个查询中。这可能吗?我该怎么做?
我是mysql的初学者。

c8ib6hqw

c8ib6hqw1#

你的问题是因为你使用 Union 在两个列数不同的表上。例如,如果你在表A中得到一些东西:

| Id | Name | Age|
+----+------+----+
| 1  | Andy | 3  |

还有一张table

| Id | Name | Age| Gender |
+----+------+----+--------|
| 1  | Andy | 3  | Male   |

如果您尝试合并它们,您将得到错误,因为它们无法合并(因为列数不同)。
所以你的问题是你的第一个 Select *... 返回的列多于第二个选择,其中只选择4列。解决这个问题的关键是指定需要选择哪些列,以便两个选择都有相同的列数。
像这样的

SELECT
    p.id AS 'PartId',
    m.`Name` AS 'Model',
    c.`Name` AS 'Color',
    pt.`Name` AS 'PartType' 
FROM
    inventory i
    JOIN part p ON p.Id = i.PartId
    JOIN model m ON m.Id = p.ModelId
    JOIN color c ON c.Id = p.ColorId
    JOIN parttype pt ON pt.Id = p.PartTypeId 
WHERE
    i.barcode1 = 'DR963560860GYYQBKBBD2' 
    OR i.barcode2 = 'DR963560860GYYQBKBBD2' 
    OR i.barcode3 = 'DR963560860GYYQBKBBD2' 
    OR i.barcode4 = 'DR963560860GYYQBKBBD2' 
UNION
SELECT
    p.id AS 'PartId',
    m.`Name` AS 'Model',
    c.`Name` AS 'Color',
    pt.`Name` AS 'PartType' 
FROM
    inventory i
    JOIN part p ON p.Id = i.PartId
    JOIN model m ON m.Id = p.ModelId
    JOIN color c ON c.Id = p.ColorId
    JOIN parttype pt ON pt.Id = p.PartTypeId 
WHERE
    barcode1 = @barcode
    OR barcode2 = @barcode
    OR barcode3 = 'DR963560860GYYQBKBBD2' 
    OR barcode4 = 'DR963560860GYYQBKBBD2';
cfh9epnr

cfh9epnr2#

我不明白为什么在连接(水平合并)看起来更合适的时候使用并集(垂直合并)

SELECT i.*,   
p.id AS 'PartId',
m.`Name` AS 'Model',
c.`Name` AS 'Color',
pt.`Name` AS 'PartType'
FROM
inventory i
JOIN part p ON p.Id = i.PartId
JOIN model m ON m.Id = p.ModelId
JOIN color c ON c.Id = p.ColorId
JOIN parttype pt ON pt.Id = p.PartTypeId 
WHERE
barcode1 = @Barcode
OR barcode2 = @Barcode
OR barcode3 = @Barcode
OR barcode4 = @Barcode

相关问题