2012-03-19 5 views
-3
SELECT * FROM Products_Joined, Products 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

я получаю ошибку Мульти p.ProductManufacturer идентификатор части не может быть привязанамульти Идентификатор части не может быть связана

Я пробовал:

  • Установку Order By
  • Добавление таблицы PRODUCTS к FROM

Есть ли что-то, что мне не хватает?

+5

Где именно находится "p" в запросе? (подсказка: нет) Также вам не хватает условия соединения. –

+0

Не могли бы Вы уточнить, что вы пытаетесь выполнить с этим запросом? Например, желаемые выходные результаты. – ImGreg

+0

'p' он никогда не работал, когда я использовал Products.ProductManufacturer – henryaaron

ответ

1

У вас нет объекта p. Вам нужно сделать псевдоним одной из ваших таблиц.

SELECT * FROM Products_Joined, Products AS p 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

Это будет исправить вашу непосредственную проблему, но вы должны иметь JOIN на ваших столах или иначе вы делаете CROSS JOIN, которые, как правило, не является предпочтительным. Пример того, как он будет выглядеть, приведен ниже.

SELECT * 
FROM Products_Joined 
    JOIN Products AS p 
     ON Products_Joined.ProductsID = p.ProductsID 
--This join is a guess on what the common column is between these two tables 
--Change as necessary 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

ОБНОВЛЕНИЕ НА ОСНОВЕ ваш комментарий

Если вы получили сообщение об ошибке, даже с Products.ProductManufacturer, то вы, вероятно, отсутствует столбец ProductManufacturer в таблице Products. Я бы проверить вашу схему и проверить, существует ли столбец.

+1

обнаружено перекрестное соединение lol –

+0

@DenisValeev Да, я это заметил. Я не собирался переписывать запрос для него, потому что я не знал, к чему присоединяться, поэтому просто оставил его без кода. Я обновил его с помощью примера –

3

Вы должны использовать:

SELECT p.*, pj.* 
FROM dbo.Products p 
INNER JOIN dbo.ProductsJoined pj ON ..... <== add your missing JOIN condition here 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

Прежде всего: никогда не используйте SELECT * в вашем рабочем коде.

Во-вторых: использовать надлежащего ANSI ПРИСОЕДИНЯЙСЯ синтаксис (INNER JOIN..), чтобы четко показать, что вы присоединяетесь, и на , что условие соединения (который отсутствует в вашем случае - вы производите декартово произведение здесь. ....)

В-третьих: если вы используете псевдонимы для таблицы, такие как p. - вам тоже нужно их определить!

+0

«никогда не используйте SELECT * в вашем производственном коде» - «всегда будьте осторожны с тем, кто говорит вам никогда ничего не делать в SQL». [В следующих примерах] (http: // stackoverflow .com/a/9328000/15354), SELECT * не приносит вреда и, возможно, имеет преимущество в отношении читаемости и обслуживания кода ... ». – onedaywhen

+0

@onedaywhen: это довольно редкие случаи края - и даже тогда - нет никакой пользы ** при использовании 'SELECT *' - вы могли бы точно также напечатать колонки, о которых идет речь, - которые я всегда рекомендую делать –

+0

. Примеры упрощены, но являются общими в их общем виде. Преимущество заключается в том, что вам не нужно вводить их снова (DRY), что уменьшает вероятность ошибочной ошибки, особенно при последующем добавлении столбцов.Но заставить пользователей всегда вводить список запятой очень строгий. Говоря о строгом: результат декартова произведения есть множество упорядоченных пар, а не отношение/таблица. Синтаксис OP - это не только ANSI SQL, но и ISO-SQL. В литературе используется термин «переменная диапазона» для того, что стандарт SQL вызывает «имя корреляции» для того, что вы называете «псевдоним»;) – onedaywhen

Смежные вопросы