【问题标题】:the used select statements have a different number of columns mysql使用的选择语句具有不同数量的列mysql
【发布时间】:2018-05-24 04:39:32
【问题描述】:

我有一个错误“使用的 select statements 有不同的列数 mysql”

我的查询

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语句中库存表中的所有数据,另一个来自另一个表。

之前,我有两个查询是

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 的初学者。

【问题讨论】:

  • 您已经编辑了问题,但是我仍然没有完全理解,您能否添加从第一个查询返回的简化示例数据,然后从第二个查询返回,最后是您希望的结果实现,就像在我显示 tableA 和 tableB 的答案中一样
  • 我已经知道该怎么做了。非常感谢! :)

标签: c# mysql


【解决方案1】:

您遇到的问题是因为您在两个具有不同列数的表上使用了Union。例如,如果您在 TableA 中得到一些东西:

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

还有一张桌子B

| 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';

【讨论】:

  • 但是如何选择库存中的所有数据和第二个选择中的另一个数据以及要获取的特定数据?
  • 提前谢谢您。 :)
  • 具体来说,我已经有 2 个查询,首先是 SELECT * FROM inventory WHERE barcode = @barcode1 ORbarcode2 = @barcode2 ORbarcode3 = @barcode3,barcode4 = @barcode4。另一个是 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 模型 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条码3 = @条码或条码4 = @条码;
  • @CloudCaineLarazza 能否请您编辑您的问题而不是将其添加到 cmets 中,如果可以,请尝试提供简化的示例数据(例如您拥有的以及预期的结果)
  • 由于我的输出加载太慢,如果可能的话,我会结合这两个查询,但我不知道该怎么做..
【解决方案2】:

我不明白为什么您使用联合(即垂直合并)而联接(水平合并)似乎更合适

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

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2019-01-30
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多