Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:在表上联接,无需担心重复行_Sql Server_Join_Left Join - Fatal编程技术网

Sql server SQL Server:在表上联接,无需担心重复行

Sql server SQL Server:在表上联接,无需担心重复行,sql-server,join,left-join,Sql Server,Join,Left Join,假设我有两张桌子: 主要目标是: 动物参考 id name 1 dog 2 cat 3 honey badger 和查找: 动物性食物 id animal_id name 1 1 dog food 2 2 cat food 3 2 fish 4 2 mice 5

假设我有两张桌子:

主要目标是:

动物参考

id      name
1       dog
2       cat
3       honey badger
和查找:

动物性食物

id      animal_id      name
1       1              dog food
2       2              cat food
3       2              fish      
4       2              mice
5       3              larva (ew, gross)       
现在说我想加入并得到动物最喜欢的食物:

SELECT id,
       name
  FROM animal_ref ar
  LEFT OUTER JOIN animal_food af on af.animal_id = ar.id
现在,上面的例子很糟糕,但是说每只动物都应该只喜欢一种食物,但是食物桌很邋遢,有时会有重复的机会(因为猫太挑剔了)

现在假设,如果动物表的结果是这个查询中的一个副本,那么世界就结束了——我们真的不在乎它们吃得太多,所以如果有副本,我们不介意选择顶部的一个


如何确保动物表始终只返回其自己的行?最好的方法是对动物id列设置唯一的约束。这样可以确保任何特定的动物在整个表中只能存在一次


我不建议随便挑选一张唱片。最好防止这种情况发生

防止这种情况发生的最好方法是对animal_id列设置唯一的约束。这样可以确保任何特定的动物在整个表中只能存在一次


我不建议随便挑选一张唱片。最好防止这种情况发生

如果你真的不在乎你得到了什么

SELECT id, name
FROM animal_ref ar
LEFT OUTER JOIN (
  SELECT animal_id, MAX(name) AS Name
  FROM animal_food 
  GROUP BY animal_id
  )  af 
ON af.animal_id = ar.id

会得到
老鼠
顺便说一句

如果你真的不在乎你得到了什么

SELECT id, name
FROM animal_ref ar
LEFT OUTER JOIN (
  SELECT animal_id, MAX(name) AS Name
  FROM animal_food 
  GROUP BY animal_id
  )  af 
ON af.animal_id = ar.id

Cat
将获得
鼠标
btw

请试用,希望对您有用

WITH CTE AS
(
 SELECT *,RN=ROW_NUMBER() OVER (
     PARTITION BY animal_id 
     ORDER BY animal_id DESC) 
     FROM #animal_food 
)

SELECT ar.id, ct.name 
FROM CTE ct 
RIGHT JOIN #animal_ref ar 
   ON ct.animal_id = ar.id 
WHERE RN = 1 OR RN is null

请把动物食品换成动物食品,把动物食品换成动物食品。请试试,希望对你有用

WITH CTE AS
(
 SELECT *,RN=ROW_NUMBER() OVER (
     PARTITION BY animal_id 
     ORDER BY animal_id DESC) 
     FROM #animal_food 
)

SELECT ar.id, ct.name 
FROM CTE ct 
RIGHT JOIN #animal_ref ar 
   ON ct.animal_id = ar.id 
WHERE RN = 1 OR RN is null

请将#animal_food改为animal_food,并将#animal_ref改为animal_ref

我不同意您标记为正确的查询

Arif查询是可以的

第二,必须有办法找到特定动物(另一张桌子)经常使用/订购的动物食品。这有意义吗

顺便说一句,你如何对动物id列设置唯一约束?
猫可能喜欢老鼠、鱼、牛奶等。我不同意你的说法

Arif查询是可以的

第二,必须有办法找到特定动物(另一张桌子)经常使用/订购的动物食品。这有意义吗

顺便说一句,你如何对动物id列设置唯一约束?
猫可能喜欢老鼠、鱼、牛奶等。

好主意。除了主键之外,我从来没有在任何列上使用过唯一约束。我想在我修复查询之前,只需中指草率地更新/插入查询?好主意。除了主键之外,我从来没有在任何列上使用过唯一约束。我猜这只是中间手指的更新/插入查询,直到我修复它们。我认为每个动物都能得到他们的老式食物,这太好了!这对我来说是可行的,直到我可以打一些人,并使用TGH的良好实践建议。谢谢。我认为每个动物都能得到他们的传统食物,这太好了!这对我来说是可行的,直到我可以打一些人,并使用TGH的良好实践建议。谢谢。#动物食物和#动物参考号是如何加载的?亲爱的,这是临时表名,它是为短时间制作的,不使用首字母。#动物食物和#动物参考号是如何加载的?亲爱的,这是临时表名,它是为短时间制作的,不提前使用