используемые операторы select имеют различное количество столбцов mysql

0

Добрый день. У меня ошибка: "используемые операторы select имеют разное количество столбцов 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, и я очень благодарен, если вы мне поможете.

Благодарю вас и безбожников.

  • 0
    Вы отредактировали вопрос, однако у меня все еще нет полного понимания, не могли бы вы добавить упрощенные образцы данных, которые возвращаются из первого запроса, затем из второго, и, наконец, результат, которого вы хотите достичь, как в моем ответе, где я показать таблицу A и таблицу B
  • 0
    Я уже знаю, что делать. Большое спасибо! :)
Теги:

2 ответа

0
Лучший ответ

Я не понимаю, почему вы используете объединение (например, вертикальное слияние), когда объединение (горизонтальное слияние) будет казаться более подходящим

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
1

Проблема заключается в том, что вы используете Union на двух таблицах с различным количеством столбцов. Например, если вы получаете что-то в TableA:

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

И еще один TableB

| 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';
  • 0
    Но как я могу выбрать все данные в инвентаре и другие данные во втором выборе с конкретными данными для получения?
  • 0
    Заранее спасибо. :)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню