如何编写SQL查询,以检索每个现有唯一ID组合的一行?

时间:2015-01-14 01:41:24

标签: sql

如果已经被问过或者这是一个基本概念我道歉 - 我在SQL中没有足够的经验知道如何简洁地问它(因此我没有太多的运气来搜索它)。

请参阅下面第一个代码段中每个表格的第一行,了解我正在使用的表格。 Table1和Table3可以有多个具有相同table2Id的行。

最初,我只是在使用Table1和Table2。我为每个Table1检索了一行,一切都很好。但是,我现在还需要从Table3中检索数据 - 我能描述其含义的最佳方法是使用以下示例:

Table1:
id    table2Id   otherData1
abc   123        "otherData"
def   123        "anotherData"

Table2:
id    otherData2
123   "yetAnotherData"

Table3:
id    table2Id  otherData3
!@#   123       "thereCouldntBeMoreData"
$%^   123       "iCantBelieveItsNotData"

要完全代表所有数据,我需要4行,一行用于abc +!@#,一行用于abc + $%^,一行用于def +!@#,最后一行用于def + $%^ 。如果我正确地描绘了这个,那么我的最终结果就是这样:

comboId   t1.id   t2.id   t3.id   t1.otherData1   t2.otherData2      t3.otherData3
abc!@#    abc     123     !@#     "otherData"     "yetAnotherData"   "thereCouldn'tBeMoreData"
abc$%^    abc     123     $%^     "otherData"     "yetAnotherData"   "iCantBelieveItsNotData"
def!@#    def     123     !@#     "anotherData"   "yetAnotherData"   "thereCouldn'tBeMoreData"
def$%^    def     123     $%^     "anotherData"   "yetAnotherData"   "iCantBelieveItsNotData"

我怎样才能做到这一点?并且提前感谢你提供的任何帮助,即使它只是指向别人对类似问题的回答。

2 个答案:

答案 0 :(得分:1)

正如WW所说,你需要一个笛卡尔联盟。幸运的是,这是SQL中的默认连接。但是,由于您需要加入的列具有不同的名称,因此需要ON个子句;您应该尝试使您加入的列具有相同的名称。

要创建comboId,您需要附加列;在SQL Server中执行该操作的语法是+,在Oracle |中,我认为MySql中有Concat()函数。每当你问一个关于SQL的问题时,总要告诉我们你正在使用哪个SQL。

在SQL Server中它将是:

SELECT t1.id+t3.id as comboId, 
       t1.id as 't1.Id', 
       t2.id as 't2.Id', 
       t3.id as 't3.Id', 
       t1.otherData1, 
       t2.otherData2, 
       t3.otherData3
FROM Table1 t1
    JOIN Table2 t2 ON t2.id=t1.table2Id
    JOIN Table3 t3 ON t3.table2Id=t2.id

答案 1 :(得分:0)

这会得到你想要的结果,但我会是第一个说它最好的hacky,没有主键和外键,我不太确定如何执行"文本-book"加入运营。

SELECT t1.id+''+t3.id comboId,t1.id t1ID, t2.id t2ID, t3.id t3ID, t1.otherData1, t2.otherData2, t3.otherData3
FROM table1 t1,table2 t2,table3 t3;