随机连接表并返回列

时间:2021-04-13 11:05:46

标签: sql sql-server tsql

我有这 3 个表:

CREATE TABLE DimEmployee(EmployeeID INT)
CREATE TABLE DimDepartment(DepartmentID INT)
CREATE TABLE DimDocteur(PositionID INT)

INSERT INTO DimEmployee(EmployeeID) VALUES (1),(2),(3)
INSERT INTO DimDepartment(DepartmentID) VALUES (1),(5),(6)
INSERT INTO DimPosition(PositionID) VALUES (7),(8),(9)

我想随机加入 3 个表并获得如下输出:(示例)

首先执行:

EmployeeID DepartmentID PositionID RandomDate
1          4            7          2020-07-24 00:00:00.000
2          5            9          2020-11-25 00:00:00.000

第二次执行:

EmployeeID DepartmentID PositionID RandomDate
1          4            7          2020-05-04 00:00:00.000  
2          5            9          2020-10-30 00:00:00.000

2 个答案:

答案 0 :(得分:2)

如果你想随机加入:

SELECT DP.EmployeeID, Q.Department INTO #T1
FROM DimEmployee AS DP

CROSS APPLY (SELECT TOP 1 Dd.DepartmentID FROM DimDepartment AS DD
ORDER BY NEWID() ) AS Q


SELECT * 
INTO #T2
FROM #T1 AS T
CROSS APPLY (SELECT TOP 1 DP.PositionID FROM DimPosition AS DP
ORDER BY NEWID() ) AS Q

或者如果你想要所有的可能性:

SELECT 
    a.EmployeeID,  b.DepartmentID, c.PositionID
FROM 
    DimEmployee AS a 
  CROSS JOIN 
    DimDepartment AS b
  CROSS JOIN 
    DimPosition AS c

答案 1 :(得分:0)

您需要对每个表进行行编号并加入行号:

CREATE TABLE DimEmployee(EmployeeID INT)
CREATE TABLE DimDepartment(DepartmentID INT)
CREATE TABLE DimDocteur(PositionID INT)

SELECT
    emp.EmployeeID,
    dep.DepartmentID,
    doc.PositionID,
    DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0) RandomDate
FROM (
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) rn
    FROM DimEmployee
) emp
JOIN (
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) rn
    FROM DimDepartment
) dep ON dep.rn = emp.rn
JOIN (
    SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) rn
    FROM DimDocteur
) doc ON doc.rn = emp.rn

您还可以将 ORDER BY 更改为 ORDER BY NEWID() 以获得更随机的排序。