SQL-запрос, возвращающий повторяющуюся информацию - PullRequest
0 голосов
/ 28 августа 2009

У меня проблема с тем, что этот оператор запроса повторяет GoalText в результатах. Есть идеи?

Полный оператор запроса:

Select  g.GoalText, convert(nvarchar, g.GoalID) + '|' + convert(nvarchar, r.GoalReqID) as GoalID, GoalReqID
from Goal g inner join GoalRequirement r
on g.GoalID = r.GoalID 
where GoalReqID in
  (Select GoalReqID
  from GoalRequirement r inner join SurveyAnswer a
   on r.QuestionID = a.QuestionID and  ReqQuestionValue = SurveyAnswer 
   where a.CycleID = 93 and ReqBMILevel is null
  and ReqEnergyBalance is null and SurveyAnswer = 1 and r.QuestionID in
    (Select  QuestionID from Question where QuestionParent = 6000));

Результаты:

GoalText   GoalID  GoalReqID
Choose lasagna, ravioli, stuffed pasta 1-3 times a week instead of 4 or more times a week.  13|442  442
Choose macaroni and cheese 1-3 times a week instead of 4 or more times a week.  14|443  443
Choose meats in gravies- beef stew, chicken pot pie,… 1-3 times a week instead of 4 or more times a week.   15|444  444
Choose spaghetti, meat sauce and/or meatballs, 1-3 times a week instead of 4 or more times a week.  16|445  445
Choose tacos, burritos, enchiladas, nachos with meat and/or cheese 1-3 times a week instead of 4 or more times a week.  17|446  446
Choose biscuits and sausage gravy 1-3 times a week instead of 4 or more times a week.   102|482 482
Choose pizza- all types and calzones 1-3 times a week instead of 4 or more times a week.    12|483  483
Choose hamburger/tuna/chicken noodle casseroles (includes “Helper”) 1-3 times a week instead of 4 or more times a week. 130|484 484
Choose lasagna, ravioli, stuffed pasta 1-3 times a week instead of 4 or more times a week.  13|485  485
Choose macaroni and cheese 1-3 times a week instead of 4 or more times a week.  14|486  486
Choose meats in gravies- beef stew, chicken pot pie,… 1-3 times a week instead of 4 or more times a week.   15|487  487
Choose spaghetti- marinara sauce only, 1-3 times a week instead of 4 or more times a week.  132|488 488
Choose spaghetti, meat sauce and/or meatballs, 1-3 times a week instead of 4 or more times a week.  16|489  489
Choose tacos, burritos, enchiladas, nachos with meat and/or cheese 1-3 times a week instead of 4 or more times a week.  17|490  490

Отдельные запросы, составляющие запрос:

Select  g.GoalText, convert(nvarchar, g.GoalID) + '|' + convert(nvarchar, r.GoalReqID) as GoalID, GoalReqID
from Goal g inner join GoalRequirement r
on g.GoalID = r.GoalID 

Результаты: в этом запросе 444 записи, но вы должны понять.

GoalText   GoalID  GoalReqID
Eat an additional 400-500 calories per day. 1|1 1
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|2 2
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|106   106
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|144   144
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|182   182
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|219   219
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|256   256
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|293   293
Choose fried potatoes, French fries, hash browns, potato salad 1-3 times a week instead of 4 or more times a week.  2|330   330
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|331   331
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|294   294
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|257   257
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|220   220
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|183   183
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|145   145
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|107   107
Choose canned fruit, in heavy syrup, 1-3 times a week instead of 4 or more times a week.    3|3 3
Choose lower fat milk (nonfat, skim, 1%, 2%) instead of whole milk. 4|4 4
Choose lower fat milk (nonfat, skim, 1%, 2%) instead of whole milk. 4|108   108
Choose lower fat milk (nonfat, skim, 1%, 2%) instead of whole milk. 4|146   146
Choose lower fat milk (nonfat, skim, 1%, 2%) instead of whole milk. 4|184   184
Choose lower fat milk (nonfat, skim, 1%, 2%) instead of whole milk. 4|221   221
Select GoalReqID
  from GoalRequirement r inner join SurveyAnswer a
   on r.QuestionID = a.QuestionID and  ReqQuestionValue = SurveyAnswer 
   where a.CycleID = 93 and ReqBMILevel is null
  and ReqEnergyBalance is null and SurveyAnswer = 1

Результаты:

GoalReqID
478
479
480
481
482
440
441
483
484
485
442
443
486
487
444
488
489
445
Select  QuestionID from Question where QuestionParent = 6000

Результаты:

QuestionID
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009

Ответы [ 3 ]

7 голосов
/ 28 августа 2009

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

4 голосов
/ 28 августа 2009

Переписал ваш запрос, чтобы он был более читабельным, и превращает подзапросы (yuck) в JOIN:

SELECT g.goaltext
       g.goalid, 
       gr.goalreqid
  FROM GOAL g
  JOIN GOALREQUIREMENT gr ON gr.goalid = g.goalid AND gr.reqbmilevel IS NULL AND gr.reqenergybalance IS NULL
  JOIN JOIN SURVEYANSWER sa ON sa.questionid = gr.questionid AND sa.surveyanswer = gr.reqquestionvalue AND sa.surveyanswer = 1
  JOIN QUESTION q ON q.questionid = gr.questionid
 WHERE sa.cycleid = 93

Это столбцы столбцов goalid и / или goalreqid, которые вызывают дублирование строк. Поскольку столбец targettext связан с несколькими goalid / etcs, вы никогда не будете получать отдельные записи для goaltext, в том числе и goalids.

1 голос
/ 28 августа 2009

Когда строка в первой таблице соединяется с более чем одной строкой во 2-й таблице, вы, очевидно, хотите, чтобы она отображалась в выводе запроса только один раз. В таком случае, КАКУЮ строку из 2-й таблицы вы хотите показать в этой единственной выходной строке ??

  • Строка, введенная последней?
  • с наибольшим идентификатором цели?
  • или что угодно ...

Вам нужно ответить на этот вопрос, прежде чем вы сможете написать запрос SQL, чтобы выполнить то, что указано в вашем ответе.

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