LebneizTech Ответов: 4

Повторите те же данные в таблицы


Я хочу напечатать то же самое имя с адресом на листе Лебеля формата А4 из 12 наклеек со стола.
Я использую datalist,не способный заполнить все на 12 уровне, он показывает только один раз.Его нужно повторить 12 раз.
Выберите * от клиента, где CustID='101'
Предложите лучшее решение.

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

SELECT * from Customer where CustID='101'

RedDk

Вы хотите напечатать одно и то же имя с адресом (который, учитывая индексированный базой данных идентификатор cutomer id, содержит эти два элемента в разных столбцах (скажем, "имя" и "адрес"), но вы используете звездочку ( * ) для возврата всех элементов столбца (сколько бы их ни было) в вашем запросе?

- Как насчет этого:

Выберите [имя], [адрес] от клиента, где CustID = 101

Kornfeld Eliyahu Peter

Не дублируйте данные, но дублируйте визуальные элементы...

LebneizTech

Уважаемый сэр, я хочу напечатать имя и адрес 12 раз на листе формата А4 Lebel из 12 наклеек . Означает один и тот же вывод с именем и адресом 12 раз.

Kornfeld Eliyahu Peter

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

CHill60

Виртуальный 5!

4 Ответов

Рейтинг:
36

OriginalGriff

Я вообще не рекомендую этого делать - это определенно то, что вы должны делать на своем языке презентации, а не на SQL.

Однако решение 1 неверно: это очень возможно, хотя и довольно неприятно.
Начните с создания таблицы под названием Count12 - ей нужен один столбец INT под названием Counter.
Заполните его 12 значениями:

Counter
1
2
3
4
5
6
7
8
9
10
11
12
Тогда это простое соединение, чтобы получить одну и ту же информацию 12 раз:
SELECT a.Name, a.Address FROM Count12 b
JOIN MyTable a ON 1=1
Если вы сделаете так, чтобы таблица Count содержала, скажем, 1000 строк, вы можете ограничить количество копий, используя WHERE:
SELECT a.Name, a.Email FROM Count12 b
JOIN MyTable a ON 1=1
WHERE b.Counter <= 5
Например, он даст вам 5 копий каждой строки.

Однако вам все же лучше сделать это на вашем языке презентации.


Рейтинг:
0

CHill60

Вам нужно использовать перекрестное соединение против списка чисел - см. статью CP Перекрестное Соединение Введение – Создание Комбинаций Строк[^]

Например: создание серии для себя ...

declare @Customer table (CustID int, CustName nvarchar(100))
insert into @Customer (CustID, CustName) values (101, 'My test data')


;with series as
(
	select 1 as datum
	UNION ALL
	select datum + 1
	from series where datum + 1 < 13
)
SELECT * from @Customer 
cross join series
where CustID=101
Или вы можете использовать системные таблицы для создания такой последовательности
SELECT * from @Customer 
CROSS JOIN (SELECT TOP (12) ROW_NUMBER() OVER (ORDER BY [object_id]) as datum FROM sys.all_objects) AS series
WHERE CustID=101


Рейтинг:
0

Data Tijori

Насколько мне известно, это невозможно, потому что sql или mysql не могут выбирать одни и те же данные несколько раз, потому что он хочет когда-нибудь уникальный ч/б их, это может быть идентификатор, любой текст или что угодно. Например, у меня есть пять столбцов id, name, country, city, status и values
1 Джон ПК КХИ 1
2 Смит Хи ПК 1
3 Джон Хи ПК 1
в этом примере вы можете получить Джона дважды, но есть один, который является уникальным b/w them is id. Но он не может выбрать Джона дважды с идентификатором 1, даже если вы будете фильтровать его в выборе столбца.
Если бы вы думали о том, что СОЮЗ это также не выявленными. Только одна вещь возможна сделать это вне sql или mysql, как в php-коде, js-коде или .net-коде.


OriginalGriff

Но оказалось, что это не так ... это вполне возможно, даже легко. Хотя это не очень хорошая идея.

CHill60

язык SQL мочь выберите одни и те же данные несколько раз - см. мое решение

Рейтинг:
0

Mike V Baker

Вы можете попробовать использовать временную таблицу с 12 (или сколько вам нужно) и объединить ее с таблицей клиентов. Я написал вам хранимую процедуру, которая должна это сделать.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE A4REPEAT
	@CustId int = 0,
	@NumTimes int = 0
AS
BEGIN
	SET NOCOUNT ON;

        IF EXISTS(SELECT * FROM #temp) DROP TABLE #temp

	CREATE TABLE #temp (
	  CustId int
	)
	DECLARE @i int = 0
	WHILE @i < @NumTimes 
	BEGIN
		SET @i = @i + 1
		INSERT INTO #temp (CustId) VALUES (@CustId)
	END

	SELECT [#temp].[CustId], [FirstName], [LastName], [... address info ...] FROM [#temp] INNER JOIN [Customer] ON [#temp].[CustId]=[Customer].[CustId];

END
GO


CHill60

Если #Temp еще не существует, то это вызовет исключение

IF EXISTS(SELECT * FROM #temp) DROP TABLE #temp
Конечно
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
так будет лучше?

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

Mike V Baker

Спасибо за Заметки. Я получил обе эти части из других постов. Если есть более элегантный способ, пожалуйста, опубликуйте его, чтобы мы все могли извлечь из него уроки. [EDIT] - теперь я вижу, что вы уже опубликовали его в решении № 3, должно быть, когда я тестировал свой. Я думаю, что мне нравится последний, который использует sys.all_objects.

CHill60

Приятно слышать, что вы тестировали свое решение! Так что многие не беспокоятся:-(
Меня тоже часто ловят на этом, так что похоже, что я просто публикую одно и то же решение.
Мне тоже нравятся все объекты... но всему есть предел.