使用笛卡尔积创建没有重复问题的比较列表

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:

SQL Fiddle

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,yy,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; 

(当然你也可以反其道而行之,用>代替<)。