使用笛卡尔积创建没有重复问题的比较列表
Using a cartisan product to created a list of comparisons with no duplicate questions
我正在编写一个查询,该查询将用于生成测试列表,其中每个项目都将与其他项目进行比较,然后进行比较。例如,包含三个项目的列表 -
- 小狗
- 电影
- 公园散步
- 阅读
测试会问你是否喜欢
小狗或电影,
小狗或在公园散步
小狗或读书
电影或公园散步
电影或阅读
公园散步或阅读。
使用创建视图查询我几乎明白了。
CREATE VIEW testquestionsvw AS
select t1.testItem AS firstItem,
t2.testItem AS secondItem
from testcontents t1 JOIN testcontents t2 on t1.testItem != t2.testItem;
但是有重复题的问题。它会问 -
电影或小狗
然后
小狗或电影。
我知道有一种优雅的方式可以编写不这样做的查询,每个问题只问一次,但我最近没做太多 SQL,我一头雾水。我可以在测试程序本身而不是在这里处理它,但这看起来更尴尬。
您可以分配行号并执行 JOIN
:
WITH Cte AS(
SELECT *,
RN = ROW_NUMBER() OVER(ORDER BY TestItem)
FROM TestContents
)
SELECT
FirstItem = t1.TestItem,
SecondItem = t2.TestItem
FROM Cte t1
INNER JOIN Cte t2
ON t2.RN > t1.RN
AND t2.TestItem != t1.TestItem
您的条件当前检查两个项目是否不同,因此您得到每个组合两次(x,y
和 y,x
)。解决这个问题的最简单方法就是任意决定始终将第一个(按字典顺序)项目放在左边:
CREATE VIEW testquestionsvw AS
SELECT t1.testItem AS firstItem,
t2.testItem AS secondItem
FROM testcontents t1
JOIN testcontents t2 ON t1.testItem < t2.testItem;
(当然你也可以反其道而行之,用>
代替<
)。
我正在编写一个查询,该查询将用于生成测试列表,其中每个项目都将与其他项目进行比较,然后进行比较。例如,包含三个项目的列表 -
- 小狗
- 电影
- 公园散步
- 阅读
测试会问你是否喜欢
小狗或电影,
小狗或在公园散步
小狗或读书
电影或公园散步
电影或阅读
公园散步或阅读。
使用创建视图查询我几乎明白了。
CREATE VIEW testquestionsvw AS
select t1.testItem AS firstItem,
t2.testItem AS secondItem
from testcontents t1 JOIN testcontents t2 on t1.testItem != t2.testItem;
但是有重复题的问题。它会问 -
电影或小狗
然后
小狗或电影。
我知道有一种优雅的方式可以编写不这样做的查询,每个问题只问一次,但我最近没做太多 SQL,我一头雾水。我可以在测试程序本身而不是在这里处理它,但这看起来更尴尬。
您可以分配行号并执行 JOIN
:
WITH Cte AS(
SELECT *,
RN = ROW_NUMBER() OVER(ORDER BY TestItem)
FROM TestContents
)
SELECT
FirstItem = t1.TestItem,
SecondItem = t2.TestItem
FROM Cte t1
INNER JOIN Cte t2
ON t2.RN > t1.RN
AND t2.TestItem != t1.TestItem
您的条件当前检查两个项目是否不同,因此您得到每个组合两次(x,y
和 y,x
)。解决这个问题的最简单方法就是任意决定始终将第一个(按字典顺序)项目放在左边:
CREATE VIEW testquestionsvw AS
SELECT t1.testItem AS firstItem,
t2.testItem AS secondItem
FROM testcontents t1
JOIN testcontents t2 ON t1.testItem < t2.testItem;
(当然你也可以反其道而行之,用>
代替<
)。