2015-11-13 4 views
1

Моя цель - создать временную таблицу, где TBL_1.RANDOM1 не существует в TBL_2.RANDOM2. Он работает, если RANDOM2 не имеет данных, но после ввода значения мой код заполняет NULLS.Как создать случайное число, которое не существует в другой таблице?

Я искал какое-то время и нашел один фрагмент кода и думал, что он работает до тех пор, пока некоторые данные не будут добавлены в столбец, который я не хотел дублировать.

SELECT DISTINCT COL1, MAX(COL2) AS COL2, MAX(COL3) AS COL3, (
    SELECT DISTINCT 'AUTOCT' 
        + CAST(ABS(CHECKSUM(NEWID()) % 899999) + 100000 AS VARCHAR(15)) AS RANDOM1 
    WHERE RANDOM1 NOT IN (
      SELECT DISTINCT RANDOM2 
      FROM TBL_2 
      WHERE RANDOM2 LIKE 'AUTOCT%' 
      ) 
    ) AS RANDOM1, COUNT(COL5) AS COL5, SUM(COL6) AS COL6 
INTO ##TEMP1 
FROM TBL_1 
+1

Вы имеете в виду ['RAND()'] (https://msdn.microsoft.com/en-us/library/ms177610 (v = sql.120) .aspx)? – Marusyk

+0

Я не вижу, как код, который вы вставили выше, будет запущен вообще. 'COL1' находится в списке выбора, но не в' GROUP BY'. «RANDOM1» в предложении where подзапроса относится к 'TBL_1.RANDOM1', который не имеет смысла, потому что вы хотите проверить, существуют ли уже существующие значения или нет, исправить? И снова, 'TBL_1.RANDOM1' не находится в' GROUP BY'. Это для Microsoft SQL Server? Кстати, глобальные таблицы temp практически всегда являются неправильным выбором. –

+0

[Возможный дубликат] (http://stackoverflow.com/questions/28500029/generate-a-random-number-which-is-not-there-in-a-table-in-sql-server) – Wanderer

ответ

1

Если я собственно понял, вы затем попытаться получить случайное число с помощью функции RAND() (при использовании SQL Server 2005 или выше). Например:

DECLARE @Random INT 
DECLARE @Upper INT = 1 
DECLARE @Lower INT = 999 
DECLARE @RandomField VARCHAR(10) 

SET @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 
SET @RandomField = 'AUTOCT' + CAST(@Random as varchar(5)) 

IF NOT EXISTS (select 1 from TBL_2 where RANDOM2 = @RandomField) 
BEGIN 
    INSERT INTO TBL_1 (RANDOM1) VALUES (@RandomField) 
END 
+0

Я попробую и посмотрю, как это работает. Как это будет работать, если у меня есть несколько строк? Должен ли я использовать инструкцию WHILE? – PPJN

+1

Спасибо MegaTron. Это сделал трюк! Я добавил цикл while, потому что у меня было несколько строк. – PPJN

0

У вас есть 2 "SELECT DISTINCT" заявления в там. Хорошее эмпирическое правило состоит в том, что, если вы присоединяетесь к таблицам и пишете отличия, вы, вероятно, можете найти лучший способ.

Я хотел бы сделать что-то вроде:

SELECT random1 
FROM table1 
EXCEPT 
SELECT random2 
FROM table2 

Возьмите эти результаты, а затем получить к конечному результату.

+0

Будет ли это работать, если я заполняю случайное число при каждом запуске кода? – PPJN

+0

Кроме того, я не вытаскиваю случайное число из TBL1, то есть там, где он будет сохранен. Это что-то меняет? – PPJN

+0

Это похоже не работает должным образом. Он заполнял одинаковое случайное число для каждой строки. У меня есть четыре строки, и каждый будет генерировать случайное число. – PPJN

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