2016-09-30 2 views
2

У меня есть две таблицы. один является местным, а другой - иностранным. так что я хочу сделать, чтобы дать номера строк после объединения двух таблиц с помощью хранимой процедуры. Сначала я хочу получить такое же количество столбцов из двух таблиц, а после этого хочу объединить в качестве одной таблицы и дать номера строк. ниже - мой запрос.Как получить номер строки с использованием хранимой процедуры sql

 

set @row_number=0; 

select (@row_number:[email protected]_number + 1) as number, 
(
select a.* 
from 
(select ID,title,last_name,first_name 
from local 
) 
a 
union all 
select b.* 
from 
(select ID,title ,last_name,first_name 
from foreign 
) 
b 
) 
; 

Не могли бы вы рассказать мне, что с этим не так?

+0

Это либо MySQL, либо SQL Server. Это совершенно разные продукты. О чём вы спрашиваете? SQL Server имеет ранжирующие функции, такие как 'ROW_NUMBER()'. У MySQL нет. MySQL не имеет большинства ранговых, оконных и аналитических функций, предлагаемых другими базами данных. –

+0

Почему люди отмечают вопросы как с тегами MySQL, так и с SQL Server, когда явно хотят получить ответ только за один из них? –

+0

Возможный дубликат [с MySQL, как я могу создать столбец, содержащий индекс записи в таблице?] (Http://stackoverflow.com/questions/3126972/with-mysql-how-can-i-generate-a- column-contains-the-record-index-in-a-table) –

ответ

1

Кажется, что вы используете MySQL, а не SQL Server, и пытаетесь эмулировать номера строк, как показано, например, in this duplicate question. Это тривиально делать в SQL Server, используя функцию ROW_NUMBER, как показано ответом @ Prdp.

MySQL, хотя он не имеет ранговых, аналитических или оконных функций, найденных в других базах данных. Такие функции можно эмулировать очень ограниченным образом, используя нестандартные трюки SQL, как показано в связанном вопросе.

Такие трюки очень ограничены. Типичное использование ROW_NUMBER - ранжирование записей внутри группы, например, 10 крупнейших продавцов по регионам. Это невозможно сделать с помощью трюка @curRow := @curRow + 1. Имеются также последствия для производительности. Этот трюк будет только работать, если строки обрабатываются последовательно.

В случае вопрос, в запрос MySQL, вероятно, выглядеть следующим образом:

SELECT l.ID, 
     l.title, 
     l.last_name, 
     l.first_name, 
     @curRow := @curRow + 1 AS row_number 
FROM ( select ID,title,last_name,first_name 
      from local 
      UNION ALL 
      select ID,title ,last_name,first_name 
      from foreign 
     ) l 
JOIN (SELECT @curRow := 0) r 

Хитрость здесь в том, что JOIN (SELECT @curRow := 0) создает переменную @curRow с начальным значением 0 и возвращает его значение. База данных будет принимать результаты запроса и для каждой строки, она увеличит переменную и вернет увеличенное значение. Это можно сделать только в конце и принудительно обрабатывать результаты.

Используя JOIN (SELECT @curRow :=0) r, вы просто избегаете создания переменной в отдельном заявлении.

+3

thnks много @Panagiotis. ваш ответ помог мне решить мою проблему – casper

2

ROW_NUMBER Используйте функцию окна в SQL SERVER

SELECT Row_number() 
     OVER(
      ORDER BY (SELECT NULL))AS number,a.* 
FROM (SELECT ID, 
       title, 
       last_name, 
       first_name 
     FROM local 
     UNION ALL 
     SELECT ID, 
       title, 
       last_name, 
       first_name 
     FROM FOREIGN) a 

Примечание: заменить (SELECT NULL) с колонкой вы хотите сделать заказ по генерации номера строки. Теперь генерация числа строк произвольна

+1

Число строк довольно бесполезно без фактического заказа, если только это не предназначено для незначительной маркировки (т. Е. Если вы действительно не заботитесь о числах). Значение будет изменяться случайным образом каждый раз, когда выполняется запрос, либо из-за параллельного выполнения, либо с изменением плана выполнения. –

+0

@PanagiotisKanavos - Am in middle of editing –

+3

Thanks @Prdp. каковы изменения, если мы используем mysql? – casper

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