查询将主要 table 与外部 table 和前 3 条记录作为来自外部 table 的列的 html
Query joining primary table with foreign table and the top 3 records as a html from a column of the foreign table
我有两个 Table:Category
& Articles
类别Table:
CID | CategoryName
----+--------------
1 | AAA Catg
2 | BBB Catg
3 | CCC Catg
4 | DDD Catg
5 | EEE Catg
6 | FFF Catg
文章 Table:
AID | CID | ArticleTitle | ArticleURL | Descrption | Date
----+-----+--------------+-----------------+-----------------+-----------
1 | 1 | AA1 Title | http://aa1.html | AA1 Description | 01-07-2017
2 | 1 | AA2 Title | http://aa2.html | AA2 Description | 02-07-2017
3 | 1 | AA3 Title | http://aa3.html | AA3 Description | 03-07-2017
4 | 1 | AA4 Title | http://aa4.html | AA4 Description | 04-07-2017
5 | 1 | AA5 Title | http://aa5.html | AA5 Description | 05-07-2017
6 | 2 | BB1 Title | http://bb1.html | BB1 Description | 01-07-2017
7 | 2 | BB2 Title | http://bb2.html | BB2 Description | 02-07-2017
8 | 2 | BB3 Title | http://bb3.html | BB3 Description | 03-07-2017
9 | 3 | CC1 Title | http://cc1.html | CC1 Description | 01-07-2017
10 | 3 | CC2 Title | http://cc2.html | CC2 Description | 02-07-2017
11 | 4 | DD1 Title | http://dd1.html | DD1 Description | 01-07-2017
我需要结果 table,方法是将类别 table 与文章 table 结合起来,通过获取文章 [=] 的前 3 条记录来生成一个列,该列将生成 html每个类别 63=]。
html 列应该是这样的:
<li>
<a href="http://aa1.html">aa1 Title</a>
<p>AA1 Description</p>
</li>
<li>
<a href="http://aa2.html">AA2 Title</a>
</li>
<li>
<a href="http://aa3.html">AA3 Title</a>
</li>
第一个 <li>
将在第一篇文章中包含锚标记和段落标记
<a href="http://aa1.html">aa1 Title</a>
<p>AA1 Description</p>
剩下的两个 <li>
标签将只有锚标签将是接下来的 2 篇文章
<a href="http://aa2.html">AA2 Title</a>
下面是结果table
CID | Category | HTML
----+----------+---------------------------------------------------------
1 | AAA Catg | <li><a href="http://aa1.html">AA1 Title</a><p>AA1 Description</p></li>
| | <li><a href="http://aa2.html">AA2 Title</a></li>
| | <li><a href="http://aa3.html">AA3 Title</a></li>
2 | BBB Catg | <li><a href="http://bb1.html">BB1 Title</a><p>BB1 Description</p></li>
| | <li><a href="http://bb2.html">BB2 Title</a></li>
| | <li><a href="http://bb3.html">BB3 Title</a></li>
3 | CCC Catg | <li><a href="http://cc1.html">CC1 Title</a><p>CC1 Description</p></li>
| | <li><a href="http://cc2.html">CC2 Title</a></li>
4 | DDD Catg | <li><a href="http://dd1.html">DD1 Title</a><p>DD1 Description</p></li>
5 | EEE Catg |
6 | FFF Catg |
这是我曾经使用过的查询
SELECT * FROM
(
SELECT DISTINCT [CID]
FROM [Articles]
) A
CROSS APPLY
(
SELECT TOP 3 '<li><a href="' + B.[ArticleURL] + '">' + B.[ArticleTitle] + '</a><p>' + B.[Description] + '</p></li>'
FROM [Articles] AS B
WHERE A.[CID] = B.[CID]
FOR XML PATH('')
) C (ArticleList)
以上查询将在所有 li
个标签中生成 html 和段落
<li>
<a href="http://aa1.html">aa1 Title</a>
<p>AA1 Description</p>
</li>
<li>
<a href="http://aa2.html">AA2 Title</a>
<p>AA2 Description</p>
</li>
<li>
<a href="http://aa3.html">AA3 Title</a>
<p>AA3 Description</p>
</li>
但我只需要第一个 li
标签内的段落标签,而不是全部 3 个。
html 标签也将采用
的形式
< li>
< a href="http://aa3.html">AA3 Title< /a>
< p>AA3 Description< /p>
</li>
如何获取html格式?
尝试下面的查询
;with testdata as (
select Articles.CID, CategoryName, ArticleTitle , ArticleURL,Description,Date
,row_number() over(partition by Category.CID order by AID) as rowNumber
from Category inner join Articles on Category.CID= Articles.CID
)
select
case when rowNumber=1 then '<li>' else '' End + '<a href="'
+ [ArticleURL] + '">' + [ArticleTitle] + '</a><p>' + [Description]
+ '</p>' + case when rowNumber=3 then '</li>' else '' End
from testdata where rowNumber<=3
for xml path('') ;
EDIT2 使用“对于 XML”
select CategoryName as '@id', (SELECT top 3
ArticleURL as '@href'
, ArticleTITLE as'p'
FROM
Articles sub
WHERE
sub.CID= Category.CID
order by sub.AID
FOR
XML path('a'),
type
)
from Category
for XML path('li')
我想你可以使用这个查询:
;with t as (
select
*,
row_number() over (partition by CID order by AID) seq
-- ^ this field will help us to find first Article of each Category
from
Articles
)
select
*,
replace(replace( -- I use `replace` for changing `<`, `>` to `<`, ``>`. `
(select top 3
ArticleURL "a/@href",
-- ^ with using this column naming you will have a tag of `a` with attribute `href`.
case when seq = 1 then ArticleTitle end p
from t
where Category.CID = t.CID
for xml path ('li')
) , '<', '<'), '>', '>') HTML
from
Category;
我有两个 Table:Category
& Articles
类别Table:
CID | CategoryName
----+--------------
1 | AAA Catg
2 | BBB Catg
3 | CCC Catg
4 | DDD Catg
5 | EEE Catg
6 | FFF Catg
文章 Table:
AID | CID | ArticleTitle | ArticleURL | Descrption | Date
----+-----+--------------+-----------------+-----------------+-----------
1 | 1 | AA1 Title | http://aa1.html | AA1 Description | 01-07-2017
2 | 1 | AA2 Title | http://aa2.html | AA2 Description | 02-07-2017
3 | 1 | AA3 Title | http://aa3.html | AA3 Description | 03-07-2017
4 | 1 | AA4 Title | http://aa4.html | AA4 Description | 04-07-2017
5 | 1 | AA5 Title | http://aa5.html | AA5 Description | 05-07-2017
6 | 2 | BB1 Title | http://bb1.html | BB1 Description | 01-07-2017
7 | 2 | BB2 Title | http://bb2.html | BB2 Description | 02-07-2017
8 | 2 | BB3 Title | http://bb3.html | BB3 Description | 03-07-2017
9 | 3 | CC1 Title | http://cc1.html | CC1 Description | 01-07-2017
10 | 3 | CC2 Title | http://cc2.html | CC2 Description | 02-07-2017
11 | 4 | DD1 Title | http://dd1.html | DD1 Description | 01-07-2017
我需要结果 table,方法是将类别 table 与文章 table 结合起来,通过获取文章 [=] 的前 3 条记录来生成一个列,该列将生成 html每个类别 63=]。
html 列应该是这样的:
<li>
<a href="http://aa1.html">aa1 Title</a>
<p>AA1 Description</p>
</li>
<li>
<a href="http://aa2.html">AA2 Title</a>
</li>
<li>
<a href="http://aa3.html">AA3 Title</a>
</li>
第一个 <li>
将在第一篇文章中包含锚标记和段落标记
<a href="http://aa1.html">aa1 Title</a>
<p>AA1 Description</p>
剩下的两个 <li>
标签将只有锚标签将是接下来的 2 篇文章
<a href="http://aa2.html">AA2 Title</a>
下面是结果table
CID | Category | HTML
----+----------+---------------------------------------------------------
1 | AAA Catg | <li><a href="http://aa1.html">AA1 Title</a><p>AA1 Description</p></li>
| | <li><a href="http://aa2.html">AA2 Title</a></li>
| | <li><a href="http://aa3.html">AA3 Title</a></li>
2 | BBB Catg | <li><a href="http://bb1.html">BB1 Title</a><p>BB1 Description</p></li>
| | <li><a href="http://bb2.html">BB2 Title</a></li>
| | <li><a href="http://bb3.html">BB3 Title</a></li>
3 | CCC Catg | <li><a href="http://cc1.html">CC1 Title</a><p>CC1 Description</p></li>
| | <li><a href="http://cc2.html">CC2 Title</a></li>
4 | DDD Catg | <li><a href="http://dd1.html">DD1 Title</a><p>DD1 Description</p></li>
5 | EEE Catg |
6 | FFF Catg |
这是我曾经使用过的查询
SELECT * FROM
(
SELECT DISTINCT [CID]
FROM [Articles]
) A
CROSS APPLY
(
SELECT TOP 3 '<li><a href="' + B.[ArticleURL] + '">' + B.[ArticleTitle] + '</a><p>' + B.[Description] + '</p></li>'
FROM [Articles] AS B
WHERE A.[CID] = B.[CID]
FOR XML PATH('')
) C (ArticleList)
以上查询将在所有 li
个标签中生成 html 和段落
<li>
<a href="http://aa1.html">aa1 Title</a>
<p>AA1 Description</p>
</li>
<li>
<a href="http://aa2.html">AA2 Title</a>
<p>AA2 Description</p>
</li>
<li>
<a href="http://aa3.html">AA3 Title</a>
<p>AA3 Description</p>
</li>
但我只需要第一个 li
标签内的段落标签,而不是全部 3 个。
html 标签也将采用
< li>
< a href="http://aa3.html">AA3 Title< /a>
< p>AA3 Description< /p>
</li>
如何获取html格式?
尝试下面的查询
;with testdata as (
select Articles.CID, CategoryName, ArticleTitle , ArticleURL,Description,Date
,row_number() over(partition by Category.CID order by AID) as rowNumber
from Category inner join Articles on Category.CID= Articles.CID
)
select
case when rowNumber=1 then '<li>' else '' End + '<a href="'
+ [ArticleURL] + '">' + [ArticleTitle] + '</a><p>' + [Description]
+ '</p>' + case when rowNumber=3 then '</li>' else '' End
from testdata where rowNumber<=3
for xml path('') ;
EDIT2 使用“对于 XML”
select CategoryName as '@id', (SELECT top 3
ArticleURL as '@href'
, ArticleTITLE as'p'
FROM
Articles sub
WHERE
sub.CID= Category.CID
order by sub.AID
FOR
XML path('a'),
type
)
from Category
for XML path('li')
我想你可以使用这个查询:
;with t as (
select
*,
row_number() over (partition by CID order by AID) seq
-- ^ this field will help us to find first Article of each Category
from
Articles
)
select
*,
replace(replace( -- I use `replace` for changing `<`, `>` to `<`, ``>`. `
(select top 3
ArticleURL "a/@href",
-- ^ with using this column naming you will have a tag of `a` with attribute `href`.
case when seq = 1 then ArticleTitle end p
from t
where Category.CID = t.CID
for xml path ('li')
) , '<', '<'), '>', '>') HTML
from
Category;