2012-06-19 120 views
2

任何访问专家的外面,可以帮助我吗?试图找出如何实现以下内容:我想要一个查询遍历个人表中的每个人,并返回在圣诞节列表字段中具有真实价值的人。这个数据库是旧的,是用CompanyName作为公司表的主键创建的(我知道 - 糟糕的设计)。为了避开拥有多个地点的公司,他们创建了一个地址栏。这样,如果“公司y”在圣地亚哥开设了新的位置,他们添加了“Y公司 - 圣地亚哥”的条目,并在地址栏中输入“Y公司”。然后,对于没有公司的个人,他们被输入“家庭”的虚拟公司条目。所以理想情况下,我想要这个查询做的是循环,抓住所有应该在圣诞节列表中的个人。如果地址栏字段不为空,我希望CompanyName等于AddressLine,但是如果CompanyName =“首页“我希望公司名称等于”“(emptry字符串)。也有些人有通宵地址,因为他们的普通地址是P.O Box。下面的查询我主要为我工作,但是我不清楚如何使CompanyName =“Home”中的公司名在返回的结果中留空。IIF功能(访问)

SELECT tblIndividuals.FirstName, tblIndividuals.LastName, IIf([tblcompanies].[addressline] Is Not Null,[tblcompanies].[addressline],[tblcompanies].[companyname]) AS CompanyName, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress1],[tblIndividuals].[MailingAddress1]) AS MailingAddress1, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress2],[tblIndividuals].[MailingAddress2]) AS MailingAddress2, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress3],[tblIndividuals].[MailingAddress3]) AS MailingAddress3, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[MailingAddress4],[tblIndividuals].[MailingAddress4]) AS MailingAddress4, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[City],[tblIndividuals].[City]) AS City, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[State],[tblIndividuals].[State]) AS State, IIf([tblIndividuals].[MailingAddress1] Is Null,[tblCompanies].[Zip],[tblIndividuals].[Zip]) AS Zip 
FROM tblIndividuals INNER JOIN tblCompanies ON tblIndividuals.CompanyName = tblCompanies.CompanyName 
WHERE (((tblIndividuals.ChristmasList)=True)) 
Order by [tblIndividuals].[companyname]; 

我很想排序公司名称值(A-Z)拥有它,然后如果在所有可能的个人的姓氏(A-Z)。我不会假装对SQL很好,所以你可以给我的任何帮助将非常感激。感谢您的时间。

回答

2

考虑一个UNION查询,例如:

SELECT i.FirstName, i.LastName, 
     IIf(c.[addressline] Is Not Null, 
      c.[addressline],c.[companyname]) AS CompanyName, 
     c.[MailingAddress1] AS MailingAddress1, 
     c.[MailingAddress2] AS MailingAddress2, 
     c.[MailingAddress3] AS MailingAddress3, 
     c.[MailingAddress4] AS MailingAddress4, 
     c.[City] AS City, 
     c.[State] AS State, 
     c.[Zip] AS Zip 
FROM tblIndividuals i 
INNER JOIN tblCompanies c ON i.CompanyName = c.CompanyName 
WHERE i.ChristmasList=True 
AND i.[MailingAddress1] Is Null 
UNION 
SELECT i.FirstName, i.LastName, 
     IIf(c.[addressline] Is Not Null,c.[addressline], 
      c.[companyname]) AS CompanyName, 
     i.[MailingAddress1] AS MailingAddress1, 
     i.[MailingAddress2] AS MailingAddress2, 
     i.[MailingAddress3] AS MailingAddress3, 
     i.[MailingAddress4] AS MailingAddress4, 
     i.[City] AS City, 
     i.[State] AS State, 
     i.[Zip] AS Zip 
FROM tblIndividuals i 
INNER JOIN tblCompanies c ON i.CompanyName = c.CompanyName 
WHERE i.ChristmasList=True 
AND i.[MailingAddress1] Is Not Null 

你可以用查询括号创建一个派生表,您可以使用排序查询设计窗口。

SELECT FirstName, LastName, etc 
FROM (<union query>) As q 
Order by q.[companyname] 
+0

非常感谢您的回复和时间。 Access只会给我提供以下“有用”的“联合查询中的语法错误”错误。由于我对一般工会不熟悉,我不确定哪里开始。你认为你能给我什么帮助? – user1389971

+0

我错过了两个别名和一个额外的支架。现在就试试。 – Fionnuala

+0

它现在运行,但公司名称仍然拉着单词“家”而不是留下那个空白。如果CompanyName等于“Home”,有没有办法让CompanyName为空? – user1389971