2016-06-13 3 views
0
SELECT MAX(column1) 
FROM table1 B , table2 A, table3 H 
WHERE B.unit=A.unit 
AND B.value=A.value 
AND B.unit=H.unit 
AND B.value=H.value 
AND A.number=1234 

Может кто-нибудь помочь мне в реструктуризации этого запроса во встроенном режиме?Реструктуризация Вид сверху

ОБРАЗЦА

Table1 
------ 
Value Unit 
001 A1 
002 B1 
003 C2 
002 A1 

Table2 
-------- 
Value Unit Number 
001 B4  11 
002 B1  1234 
004 B1  22 

TABLE3 
------- 
VALUE UNIT NUMBER COLUMN1 
001 B4  11  555 
002 B1  1234  557 
002 B1  1234  559 

OUTPUT 
------ 
MAX(C0LUMN1) 
----------- 
559 
+0

Вопрос не совсем ясен. Что случилось с этим вопросом? Что именно вы пытаетесь достичь? – Mureinik

+0

это можно сделать со встроенным видом. как макс поля, подлежащие реструктуризации с условием rownum = 1 – user1954762

+1

Это еще не ясно. У вас нет неагрегатных полей или предложения group-by, так что в любом случае у вас будет только одна строка в результирующем наборе. Измените вопрос, чтобы показать пример с исходными данными, то, что вы получаете сейчас, и то, что вы хотите видеть (и почему). –

ответ

0

В запросе нет никакой необходимости для inlineview: - если который будет переписан во встроенном виде, он будет выглядеть как

Select Max(Column1) 
From (Select Value,Unit From Table1)B, 
(Select Value,Unit,Number From Table2)A, 
Table3 as H 
Where B.Unit=A.Unit 
And B.Value=A.Value 
AND B.unit=H.unit 
And B.Value=H.Value 
AND A.number=1234; 

Ниже приведен пример, когда использовать встроенный просмотр, надеюсь, эта помощь !!!

Встроенный вид - инструкция SELECT в предложении FROM. Как уже упоминалось в разделе «Вид», представление представляет собой виртуальную таблицу, которая имеет характеристики таблицы, но не содержит никаких реальных данных. В конструкции встроенного представления вместо указания имени (таблиц) таблицы после ключевого слова FROM источник данных на самом деле происходит из представления, созданного в инструкции SQL. Синтаксис для встроенного представления:

SELECT "column_name" FROM (Inline View); 

Когда мы должны использовать встроенный просмотр? Ниже приведен пример:

Предположим, у нас есть две таблицы: первая таблица - User_Address, которая отображает каждого пользователя в почтовый индекс; вторая таблица - User_Score, которая записывает все баллы каждого пользователя. Вопрос в том, как написать SQL-запрос, чтобы найти число пользователей, набравших более 200 для каждого почтового индекса?

без использования вложенное, мы можем сделать это в два этапа:

Query 1

CREATE TABLE User_Higher_Than_200 
SELECT User_ID, SUM(Score) FROM User_Score 
GROUP BY User_ID 
HAVING SUM(Score) > 200; 

Query 2

SELECT a2.ZIP_CODE, COUNT(a1.User_ID) 
FROM User_Higher_Than_200 a1, User_Address a2 
WHERE a1.User_ID = a2.ZIP_CODE 
GROUP BY a2.ZIP_CODE; 

В приведенном выше коде, мы ввели временную таблицу , User_Higher_Than_200, чтобы сохранить список пользователей, набравших более 200. User_Higher_Than_200 затем используется для присоединения к таблице User_Address, чтобы получить окончательный результат.

We can simplify the above SQL using the inline view construct as follows: 

Query 3

 SELECT a2.ZIP_CODE, COUNT(a1.User_ID) 
     FROM 
     (SELECT User_ID, SUM(Score) FROM 
     User_Score GROUP BY User_ID HAVING SUM(Score) > 200) a1, 
     User_Address a2 
     WHERE a1.User_ID = a2.ZIP_CODE 
     GROUP BY a2.ZIP_CODE; 

Есть два преимущества по использованию вложенного представления здесь:

  1. Нам не нужно, чтобы создать временную таблицу. Это не позволяет базе данных иметь слишком много объектов, что хорошо, так как каждый дополнительный объект в базе данных стоит ресурсов для управления.

  2. Мы можем использовать один SQL-запрос для выполнения того, что хотим Обратите внимание, что мы обрабатываем встроенный просмотр точно так же, как мы рассматриваем таблицу. Сравнивая Query 2 и Query 3, мы видим, что единственное отличие заключается в том, что мы заменяем временное имя таблицы в Query 2 оператором inline view в Query 3. Все остальное остается неизменным.

Внутренний вид иногда называют производной таблицей. Эти два термина используются взаимозаменяемо.

0

мне нужно показать столбец из другой таблицы, которые имеют максимальное значение столбца

SELECT MAX(H.column1) AS max_column1, 
     MAX(A.number) KEEP (DENSE_RANK LAST ORDER BY H.column1) AS max_number 
FROM table1 B 
     INNER JOIN table2 A 
     ON (B.unit = A.unit AND B.value = A.value) 
     INNER JOIN table3 H 
     ON (B.unit = H.unit AND B.value = H.value) 
WHERE A.number=1234 
Смежные вопросы