spotligh_ly Ответов: 1

Я нуждаюсь в помощи вложенных запросов


у меня есть две таблицы: Tb1, Tb2


TB1 
------------------------
 | ID1| SNAME |
-+----+-------+----------
 | 1  | NAME1 | 
-+----+-------+----------
 | 2  | NAME2 | 
-+----+-------+----------
 | 3  | NAME3 | 
------------------------

TB1
-------------
 | ID1  |   |**___                    TB2
-------------     \___              -----------------------
 | SNAME|   |         \___          |  ID2  |         |   
-------------             |___      +-------+---------+---
                              \==>  | IDTB1 |         |
                                    +-------+---------+---  
                                    |  SID2 |         |
                                    +-------+---------+---
                                    |SVALUE |         |
                                    +-------+---------+-- 

TB2
ID2 IDTB1   SID2   SVALUE

----------------------------------
 |ID2 |IDTB1| SID2 | SVALUE  |
-+----+-----+---------------------
 | 1  |  1  |   5  |   11    |
-+----+-----+--------------------
 | 2  |  1  |   7  |    9    |
-|----|-----+--------------------
 | 3  |  1  |   7  |   10    |
-|----|-----+--------------------
 | 4  |  1  |   7  |   13    |
-|----|-----+--------------------
 | 5  |  2  |   5  |   14    |
-|----|-----+--------------------
 | 6  |  2  |   5  |   16    |
-|----|-----+--------------------
 | 7  |  2  |   5  |   18    |
-|----|-----+--------------------
 | 8  |  2  |   7  |   10    |
-|----|-----+--------------------
 | 9  |  3  |   5  |   10    |
-|----|-----+--------------------
 | 10 |  3  |   1  |   10    |
-|----|-----+--------------------
 | 11 |  3  |   7  |   22    |
---------------------------------



I want query to show results like:
example: where SID2=7

----------------------------
 | ID2 | SNAME | SVALUE |
-+-----+-------+--------+---
 |  4  | NAME1 |   13   |
-+-----+-------+--------+---
 |  8  | NAME2 |   10   |
-+-----+-------+--------+---
 |  11 | NAME3 |   22   |
----------------------------


Что я уже пробовал:

SELECT TB1.SNAME,  TB2.ID2,  ( select max(SVALUE) from tb2 where TB2.SID2 = 7 ) as SVALUE FROM dbo.TB1 INNER JOIN dbo.TB2   ON TB1.ID = TB2.IDTB1 WHERE TB2.SID2 = 7

0x01AA

ВЫБИРАТЬ
ТВ2.ID2, которое,
ТВ1.SNAME,
ТВ2.SVALUE
ЛЕВОЕ СОЕДИНЕНИЕ НА ТВ2 ТВ2.IDTTB1 = ТВ1.Типа id1
ГДЕ TB2. SID2 = '7'


должны делать это

spotligh_ly

Спасибо брат /
но я хочу вернуть одно значение IDTB1
Когда максимальное значение SValue или ID2
что легко
При применении вашего запроса эти результаты:
----------------------------
| ID2 | SNAME | SVALUE |
-+-----+-------+--------+---
| 2 / NAME1 / 9 |
-+-----+-------+--------+---
| 3 / NAME1 / 10 |
-+-----+-------+--------+---
| 4 / NAME1 / 13 |
-+-----+-------+--------+---
| 8 / NAME2 | 10 |
-+-----+-------+--------+---
| 11 / NAME3 / 22 |
-+-----+-------+--------+---


но мне нужны такие результаты, как
----------------------------
| ID2 | SNAME | SVALUE |
-+-----+-------+--------+---
| 4 / NAME1 / 13 |
-+-----+-------+--------+---
| 8 / NAME2 | 10 |
-+-----+-------+--------+---
| 11 / NAME3 / 22 |
----------------------------

1 Ответов

Рейтинг:
4

Bryian Tan

Это должно сделать это, и я думаю, что ваш пример вывода неверен. Максимальное значение для IDTB1 составляет 18, а не 10

Сначала выберите все максимальные значения с помощью функции ROW_NUMBER over из TB2, а затем присоединитесь к Tb1

SELECT  Id2, Sname, SValue
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY [IDTB1] ORDER BY svalue DESC) AS rn
        FROM    dbo.TB2
        ) q
JOIN dbo.TB1
ON q.[IDTB1] = dbo.TB1.[Id1]
WHERE   rn = 1

Выход:
Id2	Sname	SValue
4	Name1	13
7	Name2	18
11	Name3	22


spotligh_ly

Спасибо за помощь УР запрос это очень близко то, что мне нужно ,вернуть максимальное значение (SVALUE)
но вы забываете, что есть еще одно условие SID2 =value
возвращает max (SVALUE), где SID2 =7 exmpl.

Bryian Tan

Попробуйте добавить этот фильтр сразу после dbo.tbl2

spotligh_ly

ВЫБИРАТЬ
Id2, Sname, SValue
ОТ (
Выберите *, ROW_NUMBER () OVER (PARTITION BY [IDTB1] ORDER BY svalue DESC) AS rn
От ДБО.ТБ2
) вопрос
Присоединяйтесь к dbo.ТБ1
На вопрос.IDTB1 = ТВ1.Идентификатор
Где rn = 1 и q. SID2=7
но результат
--------------------------------------
Id2 Sname SValue
4 имя 1 13
11 имя 3 22

Bryian Tan

Вы пробовали разместить фильтр вот так... из dbo. tb2, где sid2= 7

spotligh_ly

спасибо проблема решена
ВЫБИРАТЬ
Id2, Sname, SValue
ОТ (
Выберите *, ROW_NUMBER () OVER (PARTITION BY [IDTB1] ORDER BY svalue DESC) AS rn
От ДБО.TB2, где SID2=7
) вопрос
Присоединяйтесь к dbo.ТБ1
На вопрос.IDTB1 = ТВ1.Идентификатор
Где rn = 1

Bryian Tan

Всегда пожалуйста.