2012-05-09 40 views
1

我有3個表.a,b,c。名稱的數據類型是varchar。我需要一個查詢,將從每個表中獲得一行,並給我另一個表,即'd '。這個d將有3行,例如。 A1以上B3上面表d C2 ..these值是隨機我每次運行此查詢時間..從每個表中隨機值的表

Table a Table b Table c 
Name  Name  Name 
a1  b1   c1 
a2  b2   c2 
a3  b3   c3 

當我運行查詢我需要一個表「d」隨機

Table d Table d 
Name  Name 
a2   b1 
b3   a3 
c1   c3 

這些表格之間沒有關係!

+0

你嘗試過什麼,到目前爲止,那麼你的預期結果集是什麼樣子? –

回答

0

--TableD

select (select top 1 name from @TableA order by newid()) as Name 
union all 
select (select top 1 name from @TableB order by newid()) 
union all 
select (select top 1 name from @TableC order by newid()) 
0

有很多方法可以從數據庫表中選擇隨機記錄或行。以下是一些不需要額外應用程序邏輯的示例SQL語句,但每個數據庫服務器都需要不同的SQL語法。

選擇一個隨機行與MySQL的

SELECT column FROM table 
ORDER BY RAND() 
LIMIT 1 

選擇與PostgreSQL的一個隨機行:

SELECT column FROM table 
ORDER BY RANDOM() 
LIMIT 1 

選擇與Microsoft SQL Server的一個隨機行

SELECT TOP 1 column FROM table 
ORDER BY NEWID() 

選擇與IBM DB2

SELECT column, RAND() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY 

排隨機選擇與甲骨文隨機記錄:

SELECT column FROM 
(SELECT column FROM table 
ORDER BY dbms_random.value) 
WHERE rownum = 1 
0

下面的查詢將換貨政...每張表中有一行隨機排列。

WITH OneRandomRowFromA 
    AS (SELECT TOP 1 
       Name 
       , RAND(CAST(NEWID() AS BINARY(6))) AS RandomNumber 
     FROM TableA 
     ORDER BY 2 
     ) , 
    OneRandomRowFromB 
    AS (SELECT TOP 1 
       Name 
       , RAND(CAST(NEWID() AS BINARY(6))) AS RandomNumber 
     FROM TableB 
     ORDER BY 2 
     ) , 
    OneRandomRowFromC 
    AS (SELECT TOP 1 
       Name 
       , RAND(CAST(NEWID() AS BINARY(6))) AS RandomNumber 
     FROM TableC 
     ORDER BY 2 
     ) 
SELECT Name 
FROM  OneRandomRowFromA 
UNION ALL 
SELECT Name 
FROM  OneRandomRowFromB 
UNION ALL 
SELECT Name 
FROM  OneRandomRowFromC 
0

試試這個,希望它會幫助你

---- This will create a random number between 1 and 3   
    DECLARE @Random1 INT; 
    DECLARE @Random2 INT; 
    DECLARE @Random3 INT; 
    DECLARE @Upper INT; 
    DECLARE @Lower INT 


SET @Lower = 1 ---- The lowest random number 
SET @Upper = 4 ---- The highest random number 
SELECT @Random1 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 
SELECT @Random2 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)  
SELECT @Random3 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 

--query here-- 
;with tableA AS 
(
    SELECT Name, 
    ROW_NUMBER() OVER (ORDER BY Name) AS RowNumber 
    FROM a 
), tableB AS 
(
    SELECT Name, 
    ROW_NUMBER() OVER (ORDER BY Name) AS RowNumber 
    FROM b 
) 
,tableC AS 
(
    SELECT Name, 
    ROW_NUMBER() OVER (ORDER BY Name) AS RowNumber 
    FROM c 
) 

select Name from tableA where RowNumber= @Random1 
union 
select Name from tableB where [email protected] 
union 
select Name from tableC where [email protected]