Соединение двух таблиц, в которых есть несколько строк, связанных с одной строкой из другой таблицы - PullRequest
0 голосов
/ 24 января 2019

Мне нужна помощь, чтобы понять, как решить проблему, с которой я сталкиваюсь при попытке объединить две таблицы, в одной из которых есть несколько строк, связанных с одной строкой из другой таблицы.Выражение ниже -

Не смог понять, как это сделать, любая помощь будет высоко оценена!

В table1 У меня есть столбцы USERID, name иage.Ключ USERID.

In table2, если у меня есть столбцы USERID и number.для каждого идентификатора может быть несколько разных числовых строк, ключи number и USERID.

Я хочу создать код SQL, который дает мне случайную строку из Table1 при условиичто возраст 32 (например) и что в Table2 тот же самый USERID не появляется в строке, в которой есть число 3 (например).

table1 выглядит как

USERID | NAME | AGE
  5    |  joe | 32 

, а в table2 у меня есть строки |USERID - 5, number - 5| и |USERID - 5, number - 1| все будет в порядке, и Джо будет включен в случайный опрос, но если я тоже получил |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 голосов
/ 24 января 2019

Добро пожаловать в 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, вы можете ВЫБРАТЬ из таблицы 2, чтобы вернуть тесты, которые вы хотите, чтобы этот человек выполнил, но при этом будут возвращены все таблицы.Непонятно, как происходит пропуск таблиц, но вы явно сказали, что не хотите включать NUMBER=3 в свой набор результатов.Если вы хотите пропустить случайный опрос, вы можете просто повторить предложение RAND(), опубликованное выше

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

Чтобы записать это как один запрос, вы можете составить оператор выбора, подобный следующему:

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-доступа, но его довольно легко перевести на другой язык

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...