我需要帮助弄清楚如何尝试内部连接2个表时遇到的问题,其中2个表中有多个与另一张表中的一行相关的行。下面的爆炸-
无法弄清楚该怎么做,我们将不胜感激!
在table1
中,我有列USERID
,name
和age
。密钥是USERID
。
在table2
中,如果我有列USERID
和number
。每个ID可以有多个不同的数字行,键为number
和USERID
。
我想创建一个SQL代码,以年龄为 32 (例如)为条件,从Table1
处给我随机行,
并且在Table2
中,没有
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_;
如果您能通过我的随机行获取技术获得帮助,我将不胜感激,因为其他人在我正在使用的程序中不起作用。
答案 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编写的,但是将其翻译成其他语言应该很容易