2015-02-18 3 views
-1

Мне нужно выбрать всю информацию из таблицы Grid, где она соответствует нескольким критериям, от объединения таблиц, т.е.SQL Выберите несколько условий И много раз

Select * from Grid 
join table1...table2...table3....table4 
where (table3.product = 'product1' AND table2.rate = 2) 
AND (table3.product = 'product2' AND table2.rate = 3 AND table2.lage = 75) 
AND (table3.product = 'product3' AND table2.rate = 0.25 AND table2.lage = 75 AND table2.uage=85) 

Это мой фактический запрос на выборку:

Select * from Grid gr 
join GridToPage g2p on gr.[GridID] = g2p.[GridID] 
join Page p on p.[PageID] = g2p.[PageID] 
join PageToProduct p2p on p2p.[PageID] = p.[PageID] 
join Product pr on p2p.[ClumpCode] = pr.[ClumpCode] 
join PageToProductToRate p2p2r on p2p2r.[PageToProductID] = p2p.[PageToProductID] 
join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID] 
where 
(pr.[ClumpCode] ='CUST5G' AND r.[Rate]=2 AND r.[LowerAge] = 0 AND r.[UpperAge] = 75) 
AND (pr.[ClumpCode] = 'CUST7' AND r.[Rate] = 4) 
AND (pr.[ClumpCode] = 'CUST5' AND r.[LowerAge] = 75 AND r.[UpperAge] = 85) 

Там может быть несколько 'и' условия. Он будет возвращать все записи, которые удовлетворяют всем условиям. Этот запрос отлично работает только с одной строкой условий, но не более, чем с одним, он не возвращает результатов. pr. [ClumpCode] - обязательное условие, другие - нет, и для этого конкретного [ClumpCode] могут быть дополнительные 4 условия. Следующая строка условий применяется для другого [ClumpCode] и т. Д. Я также пытался использовать «HAVING» с суммой> 0 для каждой строки вместо «WHERE (...) AND», но это давало мне некоторые ошибки. Как это получить, когда у меня есть несколько условий «И»?

------------ EDIT ----------------------- Спасибо за комментарии, на самом деле условие на [ClumpCode] должен поступать из таблицы Product, а не ProductRate, как и у меня. Исправлено в запросах выше. Он должен быть «И» и удовлетворять всем условиям, чтобы вернуть true.

---------- EDIT2 ------------------ Изображение, иллюстрирующее, как поиск вернет результат для 'ML_GRID' enter image description here

+4

У вас возникла проблема с вашей логикой. Вы действительно имеете 'r. [ClumpCode] = 'CUST5G' AND r. [ClumpCode] = 'CUST7'', который никогда не будет правдой, и поэтому никакие строки не будут возвращены. Вы имели в виду «OR» линии вместе? – TobyLL

+0

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

+0

@TobyLL Я сделал ошибку, которую исправил. Условие в [ClumpCode] должно состоять из другой таблицы. Таким образом, это будет pr. [ClumpCode] = 'CUST7' AND r. [Rate] = 0.25 – AidaM

ответ

2

Это всегда возвращает ложь, потому что r не может иметь несколько [ClumpCode] с или [Rate] с или [LowerAge] с или [UpperAge] сек сразу.

(r.[ClumpCode] ='CUST5G' AND r.[Rate]=2 AND r.[LowerAge] = 0 AND r.[UpperAge] = 75) 
AND (r.[ClumpCode] = 'CUST7' AND r.[Rate] = 4) 
AND (r.[ClumpCode] = 'CUST5' AND r.[LowerAge] = 75 AND r.[UpperAge] = 85) 

Вы должны были бы использовать OR вместо AND между вашими вводными условиями.

+0

Я обновил свой вопрос. Это должно быть условие «И», однако [ClumpCode] будет происходить из другой таблицы (pr), а не из-за того, что у меня это было изначально. @mstbaum – AidaM

+0

Aida вы должны слушать @mstbaum. – shawnt00

1

Один не может иметь разные значения для [ClumpCode], вам нужно или условия ред. Обычно это делается с помощью GROUP BY/HAVING, перенесите условия в производную таблицу, как это:

join 
(SELECT [ProductRatesID] 
    FROM ProductRates 
    where 
     (r.[ClumpCode] ='CUST5G' AND r.[Rate]=2 AND r.[LowerAge] = 0 AND r.[UpperAge] = 75) 
     OR (r.[ClumpCode] = 'CUST7' AND r.[Rate] = 4) 
     OR (r.[ClumpCode] = 'CUST5' AND r.[LowerAge] = 75 AND r.[UpperAge] = 85) 
    GROUP BY [ProductRatesID] 
    HAVING COUNT(*) = 3 -- the number of different conditions in WHERE 
) as r 
on r.[ProductRatesID] = p2p2r.[ProductRatesID] 

Это предполагает, что есть только одна строка в состоянии. В противном случае вам может понадобиться вместо COUNT (DISTINCT ???).

+0

Aida вы должны слушать @dnoeth. – shawnt00

0

Все ответы выше не помогли решить мою проблему. Если бы я использовал «OR» между условиями, он возвращал бы все результаты, которые содержали одно или несколько условий, где мне нужны были только совпадения, удовлетворяющие всем условиям. Закончен с использованием INTERSECT между запросами для каждого из условий и возвращает только столбцы таблицы Grid и выбирает все. Не уверен, что это самый эффективный способ сделать это.

Select gr.GridID from Grid gr 
join GridToPage g2p on gr.[GridID] = g2p.[GridID] 
join Page p on p.[PageID] = g2p.[PageID] 
join PageToProduct p2p on p2p.[PageID] = p.[PageID] 
join Product pr on p2p.[ClumpCode] = pr.[ClumpCode] 
join PageToProductToRate p2p2r on p2p2r.[PageToProductID] = p2p.[PageToProductID] 
join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID] 
where 
(pr.[ClumpCode] ='CUST5G' AND r.[Rate]=2 AND r.[LowerAge] = 0 AND r.[UpperAge] = 75) --condition #1 
INTERSECT 
Select gr.GridID from Grid gr 
join GridToPage g2p on gr.[GridID] = g2p.[GridID] 
join Page p on p.[PageID] = g2p.[PageID] 
join PageToProduct p2p on p2p.[PageID] = p.[PageID] 
join Product pr on p2p.[ClumpCode] = pr.[ClumpCode] 
join PageToProductToRate p2p2r on p2p2r.[PageToProductID] = p2p.[PageToProductID] 
join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID] 
WHERE (pr.[ClumpCode] = 'CUST7' AND r.[Rate] = 4) --condition #2 
INTERSECT 
.... 
+0

Я отправил вам ответ, который я хотел бы, чтобы вы подумали. – shawnt00

0

Эта часть вашего запроса нечетное:

join Product pr on p2p.ClumpCode = pr.ClumpCode 
join PageToProductToRate p2p2r on p2p2r.PageToProductID = p2p.PageToProductID 
join ProductRates r on r.ProductRatesID = p2p2r.ProductRatesID 

Мы все смотрели на ваш образ и ожидал увидеть данные, организованные таким образом, вместо того, чтобы, следуя шаблону из ранее присоединяется:

join Product pr on p2p.ClumpCode = pr.ClumpCode 
join ProductToRate p2r on p2r.ProductID = pr.ProductID 
join ProductRates r on r.RateID = p2r.RateID 

Поэтому я подозреваю, что отношения между этими таблицами не совсем то, что вы описали, или, по крайней мере, впечатление, которое мы читали читатели, из наших собственных предположений. Может быть, самый простой вопрос - почему стоит таблица PageToProductToRate, а не таблица ProductToRate?

Никто из нас не был бы удивлен, если бы вы сказали, что у вас есть UNION, но вы сказали нам, что у вас есть INTERSECT, чтобы работать на вас, и это только углубляет тайну. Мне действительно интересно узнать, что здесь происходит, и моя кишка все еще говорит, что что-то очень, очень неправильно.

Я предполагаю, что если вы запустите запрос ниже, вы получите намного больше, чем 11 строк (это номер вашего изображения) и еще много столбцов. Если вы хотите продолжать совместное использование, я хотел бы попытаться понять это.

select * 
from 
    Grid gr 
    inner join GridToPage g2p on gr.GridID = g2p.GridID 
    inner join Page p on p.PageID = g2p.PageID 
    inner join PageToProduct p2p on p2p.PageID = p.PageID 
    inner join Product pr on p2p.ClumpCode = pr.ClumpCode 
    inner join PageToProductToRate p2p2r on p2p2r.PageToProductID = p2p.PageToProductID 
    inner join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID] 
where 
    GridID = 'ML_GRID' /* or whatever is the appropriate value here */ 
+0

Я поставил еще один вопрос по тому же вопросу с лучшими объяснениями и примером [ссылка] (http://stackoverflow.com/questions/30810805/sql-select-multiple-conditions-many-to-many-relationship) – AidaM

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