Sql 如何创建动态内部联接

Sql 如何创建动态内部联接,sql,sql-server-2008,sql-server-2005,sql-server-2012,Sql,Sql Server 2008,Sql Server 2005,Sql Server 2012,我需要创建动态内部连接(我相信我无论如何都需要)。我有四张桌子:梨、苹果、桔子、香蕉。我在这4个表中使用了所有相同的列名 另外两张表格“水果”和“水果评论” pears apples oranges bananas ------------------------------------- id user photo comment date 对于水果表,typeid与其他表相关,1=梨,2=苹果,3=橙子,4=香蕉。 Itemid与梨、苹果、桔子或香蕉的id相关 Fruit

我需要创建动态内部连接(我相信我无论如何都需要)。我有四张桌子:梨、苹果、桔子、香蕉。我在这4个表中使用了所有相同的列名

另外两张表格“水果”和“水果评论”

pears    apples    oranges   bananas
-------------------------------------
id
user
photo
comment
date
对于水果表,typeid与其他表相关,1=梨,2=苹果,3=橙子,4=香蕉。 Itemid与梨、苹果、桔子或香蕉的id相关

Fruit 
-----------------------------------------------------------------------------
fruitsid
typeid
itemid
如何从水果表中选择前10名,并从相应的表中动态获取匹配行

工作代码

SELECT TOP (10) fruitId, id, user, photo, comment FROM 
(
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN PEARS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=1
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN APPLES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=2
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN ORANGES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=3
UNION ALL 
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN BANANAS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=4
)a
ORDER BY fruitId DESC
旧的非工作代码:

SELECT TOP (10) id, user, photo, comment FROM
(

SELECT f.typeid, f.itemid, a.id, a.user, a.photo, a.comment FROM Fruit f INNER JOIN a on f.item=a.id

--excuse the gibberish. I never used CASE before
case when f.typeid=1 then
(SELECT id, user, photo, comment FROM Pears WHERE id=f.itemid)a
case when f.typeid=2 then
(SELECT id, user, photo, comment FROM Apples WHERE id=f.itemid)a
case when f.typeid=3 then
(SELECT id, user, photo, comment FROM Oranges WHERE id=f.itemid)a
case when f.typeid=4 then
(SELECT id, user, photo, comment FROM Bananas WHERE id=f.itemid)a
)
像那样的东西,但我不知道如何正确表达。通过按FROUTSID DESC从以下“水果”表顺序中选择顶部(3),可获得以下预期结果

fruits
-----------
fruitsid   typeid     itemid
22         1          19
23         3          73
24         2          46

pears
--------------
id     user     photo    comment    date
19     tom      1.jpg    hi         2012-06-01 12:00:00.000
22     bill     5.jpg    hello      2012-06-01 13:00:00.000

apples
--------------
id     user     photo    comment
46     sam      78.jpg   howdy
22     bill     5.jpg    hello

bananas
--------------
id     user     photo    comment
32     tom      1.jpg    hi
73     bill     5.jpg    hello

oranges
--------------
id     user     photo    comment
73     jane     55.jpg   wave
22     bill     5.jpg    hello

results
-------------
19     tom      1.jpg    hi 
73     bill     5.jpg    hello
46     sam      78.jpg   howdy
使用UNION ALL和更新代码在4行上显示IO统计信息

(4 row(s) affected)
Table 'pears'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'fruit'. Scan count 3, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'apples'. Scan count 1, logical reads 16, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'oranges'. Scan count 1, logical reads 115, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

至少没有一种物理阅读是非常棒的

一种方法是使用UNION来加入每种阅读-

SELECT TOP (10) fruitId, id, user, photo, comment FROM 
(
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN PEARS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=1
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN APPLES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=2
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN ORANGES T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=3
UNION ALL
    SELECT T1.fruitsId, T2.id, T2.user, T2.photo, T2.comment 
    FROM FRUITS T1 LEFT JOIN BANANAS T2 ON (T1.itemId=T2.id)
    WHERE T1.typeId=4
)
ORDER BY fruitId DESC

如果您不想包含只存在于
水果中,而不存在于
梨|苹果|或香蕉中的记录
,那么使用
内部联接
来代替

,这不是每次都要查询四个表中的每一个,还是SQL只会删除与typeid不对应的表?好吧,查询中有typeid子句,所以结果缩小了我认为你的思路是对的,我只需要找出中间部分的IF-ELSEIF方案这是解决方案之一..不太确定这是否可能是你尝试使用
CASE
的方法。我明白你的意思,这个案子不会打到所有的桌子。。。但是如果您注意到,每个记录都会触发SELECT query INDER案例,这会对性能产生更大的影响。我将以编程方式运行数千个查询,并附加stats IO以查看明天的性能。选择的答案有效,但您可能需要重新考虑您的模式。为什么有四个表存储相同的数据?试着只用水果和水果的注释来修改表格。查询中硬编码的id(typeid)是错误模式的标志。