簡體   English   中英

使用的選擇語句具有不同數量的mysql列

[英]the used select statements have a different number of columns mysql

我有一個錯誤“所使用的選擇語句具有不同數量的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的初學者。

您遇到的問題是因為您在具有不同列數的兩個表上使用了Union 例如,如果您在TableA中得到了一些東西:

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

還有另一個TableB

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

如果您嘗試合並它們,則會出錯,因為它們無法合並(因為列數不同)。

因此,您的問題是您的第一個Select *...返回的列比第二個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';

我不明白為什么在聯接(水平合並)似乎更合適的情況下為什么使用工會(即垂直合並)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM