SQL Server присоединяется со многими, а операторы не возвращают данные. Почему?

StackOverflow https://stackoverflow.com/questions/7346300

  •  27-10-2019
  •  | 
  •  

Вопрос

Привет, я не понимаю этот простой запрос SQL с JOIN. Анкет Я хочу выбрать продукт с двумя атрибутами. Вот таблицы (продукт, а затем атрибуты):

Product table

Attribute table

И вот два запроса

Первый запрос сделайте только одно соединение с 4 и операторами и не возвращайте никаких данных (но это должно).

Второй запрос сделайте два соединения с продуктом Tables <--> attrv_1 и продуктом <--> attrv_2 и очень хорошо работает. :

Вот первый запрос

SELECT * 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv ON p.productid = attrv.productid
                    AND attrv.atrid = 1
                    AND attrv.atrvalue like '%JANICKA IWONA%' 
                    AND attrv.atrid = 2
                    AND attrv.atrvalue like '%N.ERA%' 

и второй запрос, который возвращает правильные данные:

SELECT p.* 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv_1 ON p.productid = attrv_1.productid
                    AND attrv_1.atrid = 1
                    AND attrv_1.atrvalue LIKE '%JANICKA IWONA%'
INNER JOIN tblAttributesValues attrv_2 ON p.ProductID = attrv_2.ProductId
                    AND attrv_2.atrid = 2
                    AND attrv_2.atrvalue LIKE '%N.ERA%'   

Во втором запросе SQL я дважды присоединился, чтобы найти продукт с двумя атрибутами.

Почему первый запрос не применяется, а оператор с одним присоединением?

Вот вывод:

Second query output

Это было полезно?

Решение

"Почему первый запрос не применяется, и оператор с одним соединением?"

Потому что в таблице атрибутов нет строк, которые могут иметь atrid = 1 и atrid = 2 одновременно.

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

Другие советы

Ваш первый запрос никогда не сможет вернуть никаких результатов. То, что вы просите его сделать, это получить каждый продукт, для которого таблица атрибутов имеет запись, в которой поле Atrvalue равно 1, а поле Atrvalue также равно 2. Поскольку оно должно быть одно из других, это означает Правая сторона вашего соединения никогда не будет иметь никаких записей, и, поскольку это внутреннее соединение, левая сторона никогда не будет сопоставлена, следовательно, никаких рядов. Вы на самом деле хотите или между двумя наборами условий:

SELECT * from tblProducts p join tblAttributesValues attrv ON p.productid = attrv.productid AND (attrv.atrid = 1 AND attrv.atrvalue like '%JANICKA IWONA%') OR (attrv.atrid = 2 AND attrv.atrvalue like '%N.ERA%')

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top