Проблема в SQL-запросе - PullRequest
       28

Проблема в SQL-запросе

0 голосов
/ 31 августа 2011

У меня очень большая проблема в моем запросе SQL, и я не знаю, как ее решить. Итак, у меня есть запрос:

SELECT * FROM table1 WHERE leftBorder <= 10 AND rightBorder >= 100

Все нормально.

Следующий шаг.

SELECT * FROM table1 WHERE 
(leftBorder <= 10 AND rightBorder >= 100) OR (leftBorder <= 200 AND rightBorder >= 500)

Все нормально.

Но я бы хотел взять значения левой и правой границы из запроса, поэтому:

SELECT * FROM table1 WHERE 
???
(SELECT leftBorder, rightBorder FROM table2 WHERE id in (1,2,3,4,5))

Мне нужно сделать несколько условий для запроса в запросе ... Возможно ли это? У меня нет процедуры, просто запрос.

Я пытаюсь объяснить вам:

SELECT TOP 1 leftBorder, rightBorder FROM table2 WHERE id in (1,2,3,4,5)

это возвращает мне 1 строку с leftBorder и rightBorder, и я могу использовать это в запросе как:

SELECT * FROM table1 WHERE 
table1.leftBorder <= table2.leftBorder AND table1.rightBorder >= table2.rightBorder 
(SELECT TOP 1 leftBorder, rightBorder FROM table2 WHERE id in (1,2,3,4,5)) as table2

НО! Это работает только тогда, когда у меня есть 1 строка возврата из запроса. Но что мне делать, если у меня есть 10 строк в ответ и мне нужно сгенерировать запрос для 10 условий? Могу ли я сделать это в запросе?

Ответы [ 3 ]

0 голосов
/ 31 августа 2011

Если я правильно понимаю вашу проблему, думаю, вам нужно что-то вроде этого:

SELECT
    DISTINCT t1.*
FROM
    table1 t1
JOIN
    table2 t2 
    ON (
        t1.leftBorder <= t2.leftBorder
        AND t1.rightBorder >= t2.rightBorder
        AND t2.id IN (1,2,3,4,5)
    )
0 голосов
/ 31 августа 2011

Вы можете сделать это, используя EXISTS условие:

  SELECT * 
  FROM table1 
  WHERE EXISTS
    (SELECT * 
        FROM table2 
        WHERE table2.leftBorder>=table1.leftBorder 
        and table2.rightBorder<=table1.rightBorder)
0 голосов
/ 31 августа 2011

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

SELECT * FROM table1 
WHERE l leftBorder <= (SELECT leftBorder FROM table2 WHERE id IN(1,2,3,4,5)

, либо вы можете выбрать из таблицы в подзапросе и использовать псевдоним так:

SELECT * FROM table1,  
    (SELECT leftBorder FROM table2 WHERE id IN(1,2,3,4,5) as temp 
WHERE leftBorder<= temp.leftBorder

Зависит от того, чего именно вы хотите достичь, и возможностей вашей DBS

...