ВЫБРАТЬ В, возвращая несколько записей, когда он должен вернуть 1 - PullRequest
0 голосов
/ 11 мая 2018

РЕДАКТИРОВАТЬ: с тех пор я редактировал запрос, используя JOINS вместо предложения WHERE в свете предлагаемых комментариев.Я использовал предложение WHERE вместо JOIN, потому что я не мог заставить его работать с тремя таблицами, но понял это.Я также вставил SELECT DISTINCT, потому что это решает проблему.Спасибо @MichaelEvanchik и @SeanLange за помощь.Я все еще учусь, и надеюсь, что я вас не расстраиваю, ребята.

Я просмотрел многократные ответные темы и, похоже, не нашел ответа, который бы мне помог.

У меня 4 таблицы.

table1

ID    Cat1_Name1    Cat1_Name2    Cat2_Name1    Cat2_Name2

12      Mike          Mike         George         Mike

13      Jen           Jen           Amy           Amy

14      Jeff          Jen           Mike          Ben

15      Jeff          Jeff          Fred          Tom

16      George        Jen           Luke          Amy

table2

ID    Cat1_Name1    Cat1_Name2    Cat2_Name1    Cat2_Name2

25      Mike          Mike          Jen           George

table3

Name    Cat1_Value    Cat2_Value

Mike       6.5          20.25

Jen       10.2           0.5

Jeff      11.5           1.5

George    8.0            27.1

table4

Name     Cat1_Value    Cat2_Value

Mike       7.8           20.0

Jen        6.0           13.0

Jeff       13.2          5.0

George     8.0           1.2

Прежде чем кто-либо спросит, набор имен в таблице2 должен отделиться от таблицы1.Это не дублирующая информация, а ЕДИНЫЙ НЕИЗВЕСТНЫЙ НАБОР, который будет сравниваться с каждой записью в таблице1, которая может содержать миллионы известных наборов (т. Е. Никакие идентификаторы в таблице1 никогда не будут совпадать с идентификаторами в таблице2).Если вы посмотрите на таблицы, то увидите, что набор имен МОЖЕТ совпадать между таблицами 1 и 2, но не обязательно.Например, имена для cat1 совпадают между таблицами 1 и 2 для идентификаторов 12 и 25 (все 4 - Майк), но не совпадают между идентификаторами 13, 14, 15, 16 и 25 (только два из 25 - Майк),В то время как в cat2 идентификаторы 12 и 25 совпадают частично (то есть имена в cat2 между таблицами 1 и 2 содержат имя George, но не совпадают во втором имени).Здесь я показываю две категории.Для одной записи будет более 30 категорий имен, но сейчас я остановлюсь на 1, чтобы решить эту конкретную проблему.Cat1_Name1, Cat1_Name2.Я буду беспокоиться об агрегации различных категорий и комбинаций логических имен с JOIN и UNION и позже отвечу на другой мой вопрос ... * с радостью.

Я хочу создать новую таблицу, которая возвращает идентификатор из таблицы table1 со связанным значениемдля каждой категории в зависимости от того, сколько имен совпадают в категории.Например, поскольку cat1_name 1 и 2 в table1 являются mike, mike И cat1_name 1 и 2 в table2 являются mike, mike, возвращают идентификатор из таблицы 1 (12) и значение в таблице 3 для cat1 (6.5).Различные наборы совпадающих имен будут возвращать значения из разных таблиц (т. Е. Частично совпадающий набор в cat2 между 12 и 25 может возвращать значение из table4 и т. Д.).Я задавал подобный вопрос по этому поводу ранее, но проблема была в другом:

Возвращение результатов из разных таблиц в зависимости от условий из двух других таблиц

У меня есть частичноеОтветьте за это, но теперь есть другая проблема.Я планирую опубликовать ответ на первый, как только я выясню эту проблему (надеюсь, с небольшой помощью ).

Вот мой запрос:

SELECT DISTINCT dbo.table1.ID, dbo.table3.Cat1_Value
INTO Cat1Table
FROM dbo.table2
INNER JOIN dbo.table3 ON (dbo.table1.Cat1_Name1 = dbo.table3.Name ) AND
                         (dbo.table1.Cat1_Name2 = dbo.table3.Name )
INNER JOIN dbo.table1 ON (dbo.table2.Cat2_Name1 = dbo.table3.Name ) AND
                         (dbo.table2.Cat2_Name2 = dbo.table3.Name )

Таблица результатов, которую я хочу:

Cat1Table

ID    Cat1_Value

12       6.5

Что я получаю:

Cat1Table

ID    Cat1_Value

12       6.5

12       6.5

Почему я получаю дубликат?Это моя логика или я упускаю что-то еще более простое?Если я использую SELECT DISTINCT, это дает мне правильный результат, но я думаю, что может быть более эффективный способ, потому что он будет расширен до миллионов записей.Разве SELECT DISTINCT не замедлит все?

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