Не могу получить имя связанного столбца таблицы - PullRequest
0 голосов
/ 20 июня 2020

Я только начинаю изучать SQL, и пока (с двух дней go) мне удалось решить большинство моих проблем, но теперь мне нужна помощь.

Запрос ниже приводит к 1 столбцу и строке: «12345» и некоторым дополнительным строкам со значением 0, от которых мне нужно избавиться.

SELECT product_id FROM sale_order_line WHERE order_id IN (SELECT id FROM sale_order WHERE name='S00062')

Итак, я попробовал следующее:

SELECT product_id FROM sale_order_line WHERE order_id IN (SELECT id FROM sale_order WHERE name='S00062') AND NOT product_id='0'

И теперь я получил результат «12345», которого ожидал. Но когда я пытаюсь получить имя столбца, относящегося к «12345» из другой таблицы ....:

SELECT name FROM product_template WHERE product_variant_ids IN (SELECT product_id FROM sale_order_line WHERE order_id IN (SELECT id FROM sale_order WHERE name='S00062') AND NOT product_id='0')

, я получаю сообщение об ошибке: " Невозможно сравнить целочисленный тип данных со строкой «». Каким-то образом кажется, что приведенный выше код пытается прочитать product_id со всеми нулями, прежде чем они все будут удалены. Я предполагаю.

Но, если я сделаю это напрямую, например:

SELECT name FROM product_template WHERE product_variant_ids = '12345'

Это работает! Как я могу это исправить? Простите, пожалуйста, мои новые ie навыки программирования.

1 Ответ

0 голосов
/ 20 июня 2020

Может показаться, что product_template.product_variant_ids и sale_order_line.product_id имеют несовместимый тип данных, один из integer, а другой строковый (text, varchar, ...) - как указано в сообщении об ошибке .

Сделайте привычкой уточнять все имена столбцов в запросах, включающих несколько столбцов.

Судя по именам столбцов, product_id - это integer, а product_variant_ids - это строковый тип, что, скорее всего, является ошибкой дизайна. Если он действительно содержит единственное допустимое целое число в строковом представлении, как предлагает ваш последний запрос, то, делая еще несколько предположений об ограничениях PK в вашей модели данных, ваш запрос может работать следующим образом:

SELECT pt.name
FROM   sale_order       so
JOIN   sale_order_line  sol ON sol.order_id = so.id
JOIN   product_template pt  ON pt.product_variant_ids::int = sol.product_id  -- !
WHERE  so.name = 'S00062'
AND    NOT sol.product_id = 0;  -- numeric literal without 

Обратите внимание на приведение в целое число: product_variant_ids::int. Но это всего лишь помада свинье. Столбец должен начинаться с типа integer.

С другой стороны, имя product_variant_ids указывает несколько значений, намекая на int[], массив целых чисел. Затем вам нужно сделать больше ...

Используйте нотацию JOIN вместо вложения нескольких уровней x IN (subquery). Гораздо проще и обычно намного быстрее.

Оба идентичны, если подзапрос возвращает разные значения. В противном случае запись IN сворачивает дубликаты, а соединения - нет. Это различие также делает x IN (subquery) более сложным для внутреннего выполнения и, следовательно, более дорогим.

Наконец, столбец с именем product_variant_ids обычно в любом случае указывает на ошибочный дизайн базы данных. Обычно в один столбец не помещается несколько значений. Если этот столбец имеет строковый тип поверх него, это двойное нет-нет. Вам нужно еще немного изучить реляционный дизайн и нормализацию базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...