Sql server 使用cartisan产品创建无重复问题的比较列表

Sql server 使用cartisan产品创建无重复问题的比较列表,sql-server,view,Sql Server,View,我正在编写一个查询,它将用于生成一个测试列表,其中每个项目都将与任何其他项目进行比较,然后是一个向上或向下的项目。例如,列出三个项目: 小狗 电影 在公园散步 阅读 考试会问你是否喜欢 小狗或电影 小狗或在公园散步 小狗还是读书 看电影还是在公园散步 电影还是阅读 在公园散步或读书 使用CREATEVIEW查询,我几乎可以得到这个结果 CREATE VIEW testquestionsvw AS select t1.testItem AS firstItem,

我正在编写一个查询,它将用于生成一个测试列表,其中每个项目都将与任何其他项目进行比较,然后是一个向上或向下的项目。例如,列出三个项目:

  • 小狗
  • 电影
  • 在公园散步
  • 阅读
考试会问你是否喜欢

小狗或电影

小狗或在公园散步

小狗还是读书

看电影还是在公园散步

电影还是阅读

在公园散步或读书

使用CREATEVIEW查询,我几乎可以得到这个结果

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,所以我还是一无所获。我可以在测试程序中处理它,而不是在这里,但这似乎更尴尬

您可以分配行号并执行
连接


您的情况目前检查两个项目是否不同,因此每次组合都会出现两次(
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
选择t1.testItem作为第一项,
t2.作为第二项的测试项目
来自testcontents t1
在t1.testItem

(当然,你可以做出相反的任意决定,使用
而不是
你不能在视图中使用ORDER BY,但我可以将其用作caned查询,基本上也一样好。我知道有一个简单的解决方案,抱歉垒球问题。你是对的。我忘了它应该在视图中。无论如何,很高兴我能帮上忙。
CREATE VIEW testquestionsvw AS  
SELECT  t1.testItem AS firstItem,  
        t2.testItem AS secondItem   
FROM    testcontents t1 
JOIN    testcontents t2 ON t1.testItem < t2.testItem;