如果已经被问过或者这是一个基本概念我道歉 - 我在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"
我怎样才能做到这一点?并且提前感谢你提供的任何帮助,即使它只是指向别人对类似问题的回答。
答案 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;