Ms access 如何接受两个sql查询并将它们组合成一个查询
我正在为我的程序定制脚本:Ms access 如何接受两个sql查询并将它们组合成一个查询,ms-access,jet,Ms Access,Jet,我正在为我的程序定制脚本: // You might want to use a date range and specify the first Sunday and use that variable. // Or, you may want to have a user request variable where they key in the starting Sunday #YYYY MM DD# // Let us work out the current week number
// You might want to use a date range and specify the first Sunday and use that variable.
// Or, you may want to have a user request variable where they key in the starting Sunday #YYYY MM DD#
// Let us work out the current week number
$iStartWeekNumber = $Today#CUSTOMDATE[%W] + 1
TEXT "Current week number (1 to 52): $iStartWeekNumber"
EOL
// Let us work out the current year
$iThisYear = $Today#CUSTOMDATE[%Y]
TEXT "Current year: $iThisYear"
EOL
// Now we can do a manual for loop from iStartWeekNumber to the end of the year
TEXT "TODO: Work out how to show the date nicely formatted"
EOL
$datWeek = $Today
LOOP AS $iWeekNumber FROM $iStartWeekNumber TO 52
$datWeek = $datWeek + 7
TEXT "Week: $iWeekNumber"
EOL
TEXT "Date: {$datWeek#SHORTDATE}"
EOL
// Iterate all available speakers
LOOP FROM "Congregation Speakers" NODATERANGE WHERE "Congregation" IS "$LocalCong" AND "notavail" IS "0" SORTBY "Speaker"
// Requirement 1
// 1. He is not in program for a talk in our home or another congregation for that same WEEKEND (either saturday or sunday)
// Store the current speaker into a variable
VARIABLE_FIELD "Speaker" "$strCurrentSpeaker"
LOOP SQL "SELECT * FROM [Home Talks] WHERE ((DatePart('ww',[Last Given],2)=$iWeekNumber)) AND ((DatePart('yyyy',[Last Given])=$iThisYear)) AND [Speaker] = '$strCurrentSpeaker' AND [Congregation]='$LocalCong'" ROW_COUNT "$iNumHomeTalks"
END_LOOP
LOOP SQL "SELECT * FROM [Away Talks] WHERE ((DatePart('ww',[Talk Date],2)=$iWeekNumber)) AND ((DatePart('yyyy',[Talk Date])=$iThisYear)) AND [Brother] = '$strCurrentSpeaker'" ROW_COUNT "$iNumAwayTalks"
END_LOOP
IF "$iNumHomeTalks" IS "0" AND "$iNumAwayTalks" IS "0"
// Requirement 2
// 2. He should not give a talk more than once in a MONTH (so he is unavailable if he will be giving a talk during the month)
$iMonth = date_part($datWeek,"M")
LOOP SQL "SELECT * FROM [Home Talks] WHERE ((DatePart('m',[Last Given])=$iMonth)) AND ((DatePart('yyyy',[Last Given])=$iThisYear)) AND [Speaker] = '$strCurrentSpeaker' AND [Congregation]='$LocalCong'" ROW_COUNT "$iNumHomeTalksForMonth"
END_LOOP
LOOP SQL "SELECT * FROM [Away Talks] WHERE ((DatePart('m',[Talk Date])=$iMonth)) AND ((DatePart('yyyy',[Talk Date])=$iThisYear)) AND [Brother] = '$strCurrentSpeaker'" ROW_COUNT "$iNumAwayTalksForMonth"
END_LOOP
$iTotalTalksForMonth = $iNumHomeTalksForMonth + $iNumAwayTalksForMonth
IF "$iTotalTalksForMonth" IS "0"
// Requirement 3
// 3. That same weekend either one or more than x speakers are not out for a talk or unavailable
// TO DO
TEXT "$strCurrentSpeaker"
EOL
END_IF
END_IF
END_LOOP
BLANK *1
END_LOOP
我想特别提醒您注意两组SQL查询:
第1组:
LOOP SQL "SELECT * FROM [Home Talks] WHERE ((DatePart('ww',[Last Given],2)=$iWeekNumber)) AND ((DatePart('yyyy',[Last Given])=$iThisYear)) AND [Speaker] = '$strCurrentSpeaker' AND [Congregation]='$LocalCong'" ROW_COUNT "$iNumHomeTalks"
END_LOOP
LOOP SQL "SELECT * FROM [Away Talks] WHERE ((DatePart('ww',[Talk Date],2)=$iWeekNumber)) AND ((DatePart('yyyy',[Talk Date])=$iThisYear)) AND [Brother] = '$strCurrentSpeaker'" ROW_COUNT "$iNumAwayTalks"
END_LOOP
第二组:
LOOP SQL "SELECT * FROM [Home Talks] WHERE ((DatePart('m',[Last Given])=$iMonth)) AND ((DatePart('yyyy',[Last Given])=$iThisYear)) AND [Speaker] = '$strCurrentSpeaker' AND [Congregation]='$LocalCong'" ROW_COUNT "$iNumHomeTalksForMonth"
END_LOOP
LOOP SQL "SELECT * FROM [Away Talks] WHERE ((DatePart('m',[Talk Date])=$iMonth)) AND ((DatePart('yyyy',[Talk Date])=$iThisYear)) AND [Brother] = '$strCurrentSpeaker'" ROW_COUNT "$iNumAwayTalksForMonth"
END_LOOP
以上是我自己的脚本语言。但在幕后,它接受原始SQL查询,并使用Jet在Microsoft Access数据库上运行它
他们工作得很好。但是我想知道这两组查询是否可以合并成一个?正如你所看到的,我试图确定的只是找到的记录的数量。因此,如果我能将[Home Talks]和[Have Talks]的查询结合起来,我最终只需要执行两个查询,而不是四个
在我看来,我需要使用UNION,但每个表中有一个字段不同:
最后给出
会谈日期
因此,我不能在两个查询之间缝合关键字UNION。您可以通过别名字段名来使用UNION:
SELECT [Last Given] AS MyFieldName FROM [Home Talks]
UNION
SELECT [Talk Date] AS MyFieldName FROM [Away Talks]
SELECT [Last Given], NULL AS [Talk Date] FROM [Home Talks]
UNION
SELECT NULL AS [Last Given], [Talk Date] FROM [Away Talks]
您只需列出单个字段而不是*并确保任何输出字段都匹配类型或转换为字符串,作为查询和名称别名的一部分
编辑:如果两个字段完全不相关,而不是具有不同字段名的相同或类似信息,则这是一个附加选项:
SELECT [Last Given] AS MyFieldName FROM [Home Talks]
UNION
SELECT [Talk Date] AS MyFieldName FROM [Away Talks]
SELECT [Last Given], NULL AS [Talk Date] FROM [Home Talks]
UNION
SELECT NULL AS [Last Given], [Talk Date] FROM [Away Talks]
因此,根据这两个SELECT语句的条件,它们是使用别名字段名还是原始名称?只要不使用表别名或子查询,WHERE或HAVING部分中的原始名称。我又添加了一个选项,用于两个表中的字段在上下文中不匹配,而不仅仅在名称上匹配的情况。同样的原则也可用于一个或多个联合表/查询中完全缺失的字段。