连接两个表,其中一个表中有多个与另一个表中的一行相关的行

时间:2019-01-24 17:32:18

标签: sql ms-access

我需要帮助弄清楚如何尝试内部连接2个表时遇到的问题,其中2个表中有多个与另一张表中的一行相关的行。下面的爆炸-

无法弄清楚该怎么做,我们将不胜感激!

table1中,我有列USERIDnameage。密钥是USERID

table2中,如果我有列USERIDnumber。每个ID可以有多个不同的数字行,键为numberUSERID

我想创建一个SQL代码,以年龄为 32 (例如)为条件,从Table1处给我随机行, 并且在Table2中,没有数字 3的行中没有显示相同的USERID。

table1看起来像

USERID | NAME | AGE
  5    |  joe | 32 

,在table2中,我有行|USERID - 5, number - 5||USERID - 5, number - 1|可以,并且Joe将包含在随机调查中,但是如果我也得到了|USERID - 5, number - 3|然后他不会。

USERID | NUMBER
  5    |   5
  5    |   3
  5    |   1

我已经找到了解决方法,但是没有使用table2连接,我得到的是

SELECT TOP 1 *
,Rnd(USERID) 
FROM Table1 
WHERE Age = 32 
ORDER BY Rnd(-(100000*USERID)*Time()) DESC_;

如果您能通过我的随机行获取技术获得帮助,我将不胜感激,因为其他人在我正在使用的程序中不起作用。

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow!这个问题太好了。进行了一些可读性编辑,您将在该网站上做得很好。确保您的SQL脚本用反引号封装,或使用Ctrl + K创建快捷方式,它将make your scripts more legible

至于帖子。您需要将变量声明为USERID范围的约束,否则可能会有USERID越界并且不返回任何行的风险。

DECLARE @MinUSERID INT = 1;
DECLARE @MaxUSERID INT = 100;
DECLARE @USERID INT;

现在,您可以为测试设置一个随机的USERID值。

SET @USERID = SELECT FLOOR(RAND()*(@MaxUSERID -@MinUSERID +1))+@MinUSERID 
              FROM table1
              WHERE Age = 32;

使用此随机@USERID变量,您可以从table2中进行选择,以返回您希望该个人执行的测试,但这将返回所有表。省略表的过程尚不清楚,但是您明确表示不想在结果集中包含NUMBER=3。如果您想省略随机调查,则只需复制上面发布的RAND()子句

SELECT *
FROM table2
WHERE USERID = @USERID
AND NUMBER <> 3

要将其写为一个查询,您可以草拟类似于以下内容的select语句:

DECLARE @MinUSERID INT = 1;
DECLARE @MaxUSERID INT = 100;

SELECT t1.NAME
     , t1.AGE
     , t2.USERID
     , t2.NUMBER
FROM table1 t1
INNER JOIN table2 t2
ON t1.USERID=t2.USERID
WHERE t1.Age =32
AND t1.USERID=FLOOR(RAND()*(@MaxUSERID -@MinUSERID +1))+@MinUSERID 
AND t2.NUMBER <> 3

这是为SQL Server而不是ms-access编写的,但是将其翻译成其他语言应该很容易