题
我要缩短这个查询,而我在SQL不错,我还在学习。
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Recipient-Address], 6) IN ('doejoh')
UNION ALL
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Recipient-Address], 10) IN ('john.doe@g')
UNION ALL
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Sender-Address], 6) IN ('doejoh')
UNION ALL
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Sender-Address], 10) IN ('john.doe@g')
ORDER BY
DateTime
我要使用这个联盟,因为在同一个表中,有针对每个用户和他们的电子邮件地址,4种不同的可能性。话虽这么说,我有30个用户,那么30x4将120团在这整个查询。第一列是用户名的原因是因为我使用的水晶报表的列。
我只是希望创造我的查询一些逻辑,这将缩短下来,而在同一时间,每个用户到适当的第一列“分配”。
<强>编辑补充强>
虽然这将缩短我的查询,我还是得有30个工会:
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Recipient-Address], 6) IN ('doejoh') OR
LEFT([Recipient-Address], 10) IN ('john.doe@g') OR
LEFT([Sender-Address], 6) IN ('doejoh') OR
LEFT([Sender-Address], 10) IN ('john.doe@g')
ORDER BY
DateTime
由于下一个用户将被联合到前一个:
UNION ALL
SELECT
'doejan',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Recipient-Address], 6) IN ('doejan') OR
LEFT([Recipient-Address], 10) IN ('jane.doe@g') OR
LEFT([Sender-Address], 6) IN ('doejan') OR
LEFT([Sender-Address], 10) IN ('jan.doe@g')
等等等等......任何短呢?
解决方案
是否有这样的一个理由是行不通的?
CREATE TABLE #TempNames
(
shortname nvarchar(6),
longname nvarchar(10)
)
INSERT INTO #TempNames (shortname, longname) VALUES('doejoh', 'john.doe@g')
INSERT INTO #TempNames (shortname, longname) VALUES('doejan', 'jan.doe@g')
INSERT INTO #TempNames (shortname, longname) VALUES('smibob', 'bob.smith@g')
SELECT
#TempName.shortname,
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
INNER JOIN
#TempNames
ON
LEFT([Recipient-Address], 6) = #TempNames.shortname
OR
LEFT([Recipient-Address], 10) = #TempNames.longname
OR
LEFT([Sender-Address], 6) = #TempNames.shortname
OR
LEFT([Sender-Address], 10) = #TempNames.longname
其他提示
您应该重写查询为:
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
LEFT([Recipient-Address], 6) IN ('doejoh') OR
LEFT([Recipient-Address], 10) IN ('john.doe@g') OR
LEFT([Sender-Address], 6) IN ('doejoh') OR
LEFT([Sender-Address], 10) IN ('john.doe@g')
ORDER BY
DateTime
应该是相同的选择方面,只是有点更快,更容易理解,我想。
马克
创建的映射表,并加入到它。
例如。类似
select user_name, DateTime ....
from Logs
join Users on
LEFT([Recipient-Address], 6) IN (user_name) OR
LEFT([Recipient-Address], 10) IN (user_email) OR
LEFT([Sender-Address], 6) IN (user_name) OR
LEFT([Sender-Address], 10) IN (user_email)
你能不能只使用...
SELECT
'doejoh',
DATETIME,
[Recipient-Address], [Message-Subject], [Sender-Address]
FROM
dbo.Logs
WHERE
(LEFT([Recipient-Address], 10) IN ('john.doe@g'))
or (LEFT([Recipient-Address], 6) IN ('doejoh') )
or ( LEFT([Sender-Address], 10) IN ('john.doe@g'))
or (LEFT([Sender-Address], 6) IN ('doejoh') )
与30人的电子邮件地址创建一个表。 表:电子邮件 列:short6,long10,电子邮件
然后仅使用1 UNION ALL
Select Emails.short6, Logs.DateTime, Logs.[Recipient-Address], Logs.[Message-Subject], Logs.[Sender-Address]
From Emails JOIN Log on Emails.email = Log.[Recipient-Address]
Where LEFT([Recipient-Address], 6) = Emails.short6
or LEFT([Recipient-Address], 10) = Emails.long10
union all
Select Emails.short6, Logs.DateTime, Logs.[Recipient-Address], Logs.[Message-Subject], Logs.[Sender-Address]
From Emails JOIN Log on Emails.email = Log.[Sender-Address]
Where LEFT([Sender-Address], 6) = Emails.short6
or LEFT([Sender-Address], 10) = Emails.long10
不隶属于 StackOverflow