Запрос SQLite - PullRequest
       2

Запрос SQLite

0 голосов
/ 10 октября 2011

У меня есть таблица ProductClassification с двумя столбцами 'ProductID, ClassificationID'

ProductID, ClassificationID
10408, 1749
10408, 1750

У ProductID может быть несколько ClassificationID.Как извлечь один продукт, если я сделаю запрос на несколько разных ClassificationID.

, например: ниже не работает

SELECT Product.ID, Product.Name FROM
Product, ProductClassification WHERE
ProductClassification.ClassificationID = '1750' AND
ProductClassification.ClassificationID = '1749'

Ответы [ 4 ]

1 голос
/ 10 октября 2011

Вы, кажется, новичок в SQL. Бедно пройти через это. Я бы предложил добавить эти операторы SQL, чтобы понять, что происходит.

SELECT * FROM Product, ProductClassification

На этом этапе вы будете выбирать каждую возможную комбинацию строк из обеих таблиц. Теперь вы хотите запустить фильтр. Для начала вам нужно получить классификацию вашего продукта. Вы должны использовать «ИЛИ» здесь вместо AND. Нет ProductClassification.ClassificationID будет ОБА 1750 И 1749.

SELECT * FROM Product, ProductClassification WHERE
ProductClassification.ClassificationID = '1750' OR
ProductClassification.ClassificationID = '1749'

На данный момент вы отфильтровали ProductClassification.ClassificationID, но вам нужно указать, что вас интересуют только строки, в которых ProductClassification.ProductID и Product.ID совпадают.

SELECT * FROM Product, ProductClassification WHERE
(ProductClassification.ClassificationID = '1750' OR
ProductClassification.ClassificationID = '1749') AND
ProductClassification.ProductID = Product.ID

Это даст вам отдельную строку для каждой возможной комбинации в этом фильтре. В вашем примере у вас должно быть две строки - одна с ClassificationID 1750 и одна с ClassificationID 1749. Поскольку вас интересуют только Product.ID и Product.Name, вы должны вернуть только эти два поля:

SELECT Product.ID, Product.Name FROM Product, ProductClassification WHERE
(ProductClassification.ClassificationID = '1750' OR
ProductClassification.ClassificationID = '1749') AND
ProductClassification.ProductID = Product.ID

И, вероятно, вам нужны только уникальные значения, поэтому вы можете использовать оператор «DISTINCT», который отфильтрует ваш возврат к уникальным значениям:

SELECT DISTINCT Product.ID, Product.Name FROM Product, ProductClassification WHERE
(ProductClassification.ClassificationID = '1750' OR
ProductClassification.ClassificationID = '1749') AND
ProductClassification.ProductID = Product.ID

Есть гораздо лучшие способы обработать этот запрос с помощью операторов JOIN, но это хорошее начало.

1 голос
/ 10 октября 2011

Требуется предложение OR или IN (не уверен, поддерживает ли SQLLite или нет).

Ваш запрос в письменном виде ищет два значения в одном поле для ЖЕЗАПИСЬ , что невозможно.

Попробуйте:

SELECT Product.ID, Product.Name FROM
Product, ProductClassification WHERE
ProductClassification.ClassificationID = '1750' OR
ProductClassification.ClassificationID = '1749'

ИЛИ

SELECT Product.ID, Product.Name FROM
Product, ProductClassification WHERE
ProductClassification.ClassificationID IN ('1750','1749')
1 голос
/ 10 октября 2011

введите это, вы пропустите часть "внутреннего соединения" например:

SELECT Product.ID, Product.Name FROM Product inner join ProductClassification  on Product.ClassificationID  = ProductClassification.ClassificationID WHERE
ProductClassification.ClassificationID = '1750' or
ProductClassification.ClassificationID = '1749'
1 голос
/ 10 октября 2011
  • Предложение WHERE проверяется для каждой записи отдельно.
  • В одной записи ClassificationID не может быть 1750 И 1749.
  • Изменение этого значения на 1750 OR 1749 позволяет фильтровать все индивидуальные записи.
  • Затем вам нужно проверить, что для любой One Product.ID обе записи прошли.


SELECT
  Product.ID,
  Product.Name
FROM
  Product
INNER JOIN
  ProductClassification 
    ON Product.ID = ProductClassification.ProductID
WHERE
  ProductClassification.ClassificationID = '1750' OR
  ProductClassification.ClassificationID = '1749'
GROUP BY
  Product.ID,
  Product.Name
HAVING
  COUNT(DISTINCT ProductClassification.ClassificationID) = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...