sql – 仅从多个表中选择相同的列什么东西=某事

前端之家收集整理的这篇文章主要介绍了sql – 仅从多个表中选择相同的列什么东西=某事前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个结构非常相似的表.
Universidades
nombre | contenido | becas | fotos etc etc etc
Internados
nombre | todo | becas | fotos etc etc etc

我想编写一个sql语句,它将从它们中选择nombre并仅在匹配时将其作为数组返回.从我所看到的UNION SELECT似乎是这样做的方式.我最后添加了WHERE,我认为这是它出错的地方.到目前为止,我收到了第一张表的第一行.

我打错了什么?

$db = new PDO(DB_DSN,DB_USERNAME,DB_PASSWORD);
$data = $db->prepare("SELECT nombre FROM internados UNION SELECT nombre FROM universidades WHERE nombre = ?");
$data->execute(array($nombre));

道歉,我想从这两个表中检索一个结果. nombre列中的名称在两个表中都是单独的和不同的

解决方法

解决问题之前要指出的一个问题是UNION中的每个查询都是不同的,并且需要自己的WHERE子句.唯一适用于整个UNION的条款是ORDER BY.所以你的查询需要一些调整:
SELECT nombre
FROM dbo.internados
WHERE nombre = ? -- the added line
UNION
SELECT nombre
FROM dbo.universidades
WHERE nombre = ?
;

其次,如果你想要两个表都有相同的nombre(这不是很清楚,但我猜这是正确的),那么这将无法工作,因为如果在任一表中找到值,它只返回一个nombre.解决这个问题的最好方法可能就是加入:

SELECT I.nombre
FROM
   dbo.internados I
   INNER JOIN dbo.universidades U
      ON I.nombre = U.nombre
WHERE
   I.nombre = ?
   AND U.nombre = ? -- perhaps not needed,but perhaps helpful
;

我并不是100%确定我完全理解你在寻找什么,所以如果我错过了标记,请大声说出来.

您可以这样考虑JOIN和UNION:

> JOIN:水平连接行

>在条件下匹配它们
>创建新列
>不完全创建行,因为所有数据都来自现有行,但是当条件与另一个输入中的多个行匹配时,它将从一个输入复制一行.如果两个输入都有重复,则它将一个输入的行数乘以另一个输入的匹配行数.
>如果根本没有匹配条件(想想CROSS JOIN)那么你可以得到一个笛卡尔积,它是一个输入中的每一行与另一行中的每一行匹配.
>使用OUTER连接时 – LEFT,RIGHT,FULL – 如果来自内部输入的行(或任何带有FULL的输入)与另一个不匹配,则NULL将被放入另一个输入的列中.

> UNION:垂直堆叠行

>通常,创建新行
>没有使用任何条件,没有真正的匹配
> UNION本身(不是UNION ALL)将删除重复的行,即使一个输入没有行

请注意,可以修改UNION以完成工作,但这并不理想:

SELECT nombre
FROM (
   SELECT nombre
   FROM dbo.internados
   WHERE nombre = ?
   UNION ALL
   SELECT nombre
   FROM dbo.universidades
   WHERE nombre = ?
) N
GROUP BY nombre
HAVING Count(*) = 2
;

通过这种方式,我们确保有两个值.请注意,这假设每个表中不能有两个相同的名称.如果这是真的,那么需要做更多工作才能使UNION方法完成工作.

猜你在找的MsSQL相关文章