2015-11-13 61 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」中。子查詢的where子句中的RANDOM1指的是'TBL_1.RANDOM1',這是沒有意義的,因爲你想檢查新值是否已經存在或不存在,是正確的?再次,'TBL_1.RANDOM1'不在'GROUP BY'中。這是否適用於Microsoft SQL Server?順便說一句,全球臨時表幾乎總是錯誤的選擇。 –

+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